使用vscode扩展api函数的单元测试函数

时间:2017-12-20 12:34:33

标签: typescript unit-testing visual-studio-code mocha vscode-extensions

我试图想出一种单元测试函数的方法,其中包括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);
  })
})

3 个答案:

答案 0 :(得分:2)

您的问题的解决方案称为“依赖注入”:

首先,尝试将依赖项与代码分开,然后以可以在函数或类或原型之外设置这些依赖项的方式进行。

 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;
   }

现在您可以将存根或模拟传递给unitTestMe,如

const stub = {
   window : {
      showQuickPick = function(param) {
         // return some stuff
      }
   }
}

unitTestMe(stub)

答案 1 :(得分:1)

以下是我在当前项目中的做法:我创建了一个名为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,但在其他模拟框架中它应该没有什么不同

答案 2 :(得分:0)

如果您需要模拟showQuickPick方法,则下面的代码将这样做:

vscode.window.showQuickPick = (items: string[] | Thenable<string[]>) => {
  return Promise.resolve('Continue') as Thenable<any>;
};