我试图找出一种单元测试函数的方法,其中包括vscode扩展api中包含的辅助函数,如showQuickPick。用法示例:vscode.window.showQuickPick(['one', 'two']);
。
我一直试图捏造和嘲笑那些,但是虽然我不确定这是否是正确的方法,但我还是没有任何运气。
完整的示例可能如下所示:
logic.js
export async function unitTestMe(): Promise<string> {
const quickPickAnswer: string = vscode.window.showQuickPick(['one', 'two']);
return quickPickAnswer;
}
logic.test.js
import { unitTestMe } from './logic';
describe('should return user input', () => {
test('', () => {
const expected: string = 'expect me';
const actual: string = await unitTestMe();
expect(actual).to.eql(expected);
})
})
您的问题的解决方案称为“依赖注入”:
首先,尝试将依赖项与代码分开,然后以可以在函数或类或原型之外设置这些依赖项的方式进行。
即
function unitTestMe(vsCodeExtensionApi) {
const quickPickAnswer = vsCodeExtensionApi.window.showQuickPick(['one', 'two']);
return quickPickAnswer;
}
或者如果你有课
class MagicClass {
constructor(vsCodeExtensionApi) {
this._vsCodeExtensionApi = vsCodeExtensionApi;
}
unitTestMe() {
const quickPickAnswer = this._vsCodeExtensionApi.window.showQuickPick(['one', 'two']);
return quickPickAnswer;
}
现在你可以将stub或mock传递给unitTestMe了
const stub = {
window : {
showQuickPick = function(param) {
// return some stuff
}
}
}
unitTestMe(stub)
以下是我在当前项目中的做法:我创建了一个名为VscodeEnvironment的类,其中包含了Vs Code API(一个间接层)
export class VscodeEnvironment {
public getActiveTextEditor(): vscode.TextEditor{
return vscode.window.activeTextEditor;
}
public showErrorMessage(message: string): void {
vscode.window.showErrorMessage(message);
}
public showQuickPick<T extends QuickPickItem>(items: T[] | Thenable<T[]>, options?: QuickPickOptions, token?: CancellationToken): Thenable<T | undefined> {
return vscode.window.showQuickPick(items, options, token);
}
}
在我的单元测试中,我设置了一个VscodeEnvironment存根来返回一个已解决的promise:
let vscodeEnvStub = moq.Mock.ofType(VscodeEnvironment);
vscodeEnvStub.setup(x => x.showQuickPick(moq.It.isAny(), moq.It.isAny())).returns(()=>Promise.resolve<QuickPickItem>(fakeItem));
我正在使用typemoq,但在其他模拟框架中应该没有什么不同