Skip to content

Commit 6f83b0e

Browse files
committed
Singleton mocks for vscode namespcaes
1 parent 572f26d commit 6f83b0e

1 file changed

Lines changed: 31 additions & 4 deletions

File tree

src/test/vscode-mock.ts

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,24 @@ const Module = require('module');
1212
type VSCode = typeof vscode;
1313

1414
const mockedVSCode: Partial<VSCode> = {};
15-
15+
const mockedVSCodeNamespaces: { [P in keyof VSCode]?: TypeMoq.IMock<VSCode[P]> } = {};
1616
const originalLoad = Module._load;
1717

18+
generateMock('workspace');
19+
generateMock('window');
20+
generateMock('commands');
21+
generateMock('languages');
22+
generateMock('env');
23+
generateMock('debug');
24+
generateMock('extensions');
25+
generateMock('scm');
26+
27+
function generateMock<K extends keyof VSCode>(name: K): void {
28+
const mockedObj = TypeMoq.Mock.ofType<VSCode[K]>();
29+
mockedVSCode[name] = mockedObj.object;
30+
mockedVSCodeNamespaces[name] = mockedObj as any;
31+
}
32+
1833
export function initialize() {
1934
Module._load = function (request, parent) {
2035
if (request === 'vscode') {
@@ -24,10 +39,22 @@ export function initialize() {
2439
};
2540
}
2641

42+
/**
43+
* Gets the mocked VS Code namespaces/classes.
44+
* For VS Code namespaces, always return pre-mocked objects, else create a new mock object.
45+
* @export
46+
* @template K
47+
* @param {K} name
48+
* @returns {TypeMoq.IMock<VSCode[K]>}
49+
*/
2750
export function mock<K extends keyof VSCode>(name: K): TypeMoq.IMock<VSCode[K]> {
28-
const mockedObj = TypeMoq.Mock.ofType<VSCode[K]>();
29-
mockedVSCode[name] = mockedObj.object;
30-
return mockedObj;
51+
if (mockedVSCodeNamespaces[name] === undefined) {
52+
return TypeMoq.Mock.ofType<VSCode[K]>();
53+
}
54+
// When re-using, always reset (other tests could have used this same instance).
55+
const mockObj = mockedVSCodeNamespaces[name]!;
56+
mockObj.reset();
57+
return mockObj as any as TypeMoq.IMock<VSCode[K]>;
3158
}
3259

3360
// This is one of the very few classes that we need in our unit tests.

0 commit comments

Comments
 (0)