【问题标题】:How to stub dependencies in unit tests when using TypeScript and Sinon使用 TypeScript 和 Sinon 时如何在单元测试中存根依赖项
【发布时间】:2020-01-03 02:11:17
【问题描述】:

我正在使用 TypeScript 构建 Koa REST API,并使用名为 Awilix 的依赖注入库来简化单元测试。

如果我不使用 TypeScript,我会这样编写单元测试:

  // setup
  const userService = {
    getUserById: sinon.stub(),
  };
  const userController = factory(userService);

  // example test
  it('works', () => {
    userController();
    expect(userService.getUserById).to.have.been.called();
  });

由于 userService 接口有更多的方法,而不仅仅是getUserById,当你使用 TypeScript 时,我会收到如下错误:

Property 'insert' is missing in type '{ getUserById: SinonStub<any[], any>; }' but required in type 'UserServiceInterface'.

有没有办法解决这个问题,而不必删除依赖项的每一个方法?

谢谢

【问题讨论】:

  • const userService: any = {...}?
  • @jonrsharpe userService 的接口比这更严格。这将导致上述相同的错误
  • ^ @jshjohnson 我使用any 尝试了这个案例,但没有收到错误
  • 这可能会有所帮助:npmjs.com/package/ts-sinon

标签: typescript dependency-injection mocha.js tdd sinon


【解决方案1】:

您可以使用sinon.createStubInstance(MyConstructor, overrides) 方法创建一个以给定函数作为原型的新对象,并存根所有已实现的函数。

例如

userService.ts:

export interface IUserService {
  getUserById(id: string): Promise<any>;
  insert(data: any): any;
}

export class UserService implements IUserService {
  async getUserById(id: string): Promise<any> {
    throw new Error('not implementated');
  }
  insert(data: any): any {
    throw new Error('not implementated');
  }
}

userController.ts:

import { IUserService } from './userService';

export function factory(userService: IUserService) {
  return async function userController() {
    return userService.getUserById('1');
  };
}

userController.test.ts:

import sinon from 'sinon';
import { factory } from './userController';
import { UserService } from './userService';

// const userService = {
//   getUserById: sinon.stub(),
// };
const userService = sinon.createStubInstance(UserService);
const userController = factory(userService);

describe('57716288', () => {
  it('works', () => {
    userController();
    sinon.assert.called(userService.getUserById);
  });
});

测试结果:

  57716288
    ✓ works


  1 passing (4ms)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 2021-04-30
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多