Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用TypeScript和Sinon时如何在单元测试中存根依赖项_Typescript_Dependency Injection_Mocha.js_Tdd_Sinon - Fatal编程技术网

使用TypeScript和Sinon时如何在单元测试中存根依赖项

使用TypeScript和Sinon时如何在单元测试中存根依赖项,typescript,dependency-injection,mocha.js,tdd,sinon,Typescript,Dependency Injection,Mocha.js,Tdd,Sinon,我使用Type脚本构建一个膝关节炎API,我使用一个依赖性注入库AWILIX,使单元测试更简单。 如果我没有使用TypeScript,我会这样编写单元测试: //设置 常量用户服务={ getUserById:sinon.stub(), }; const userController=工厂(userService); //示例测试 它('有效',()=>{ 用户控制器(); expect(userService.getUserById.to.have.been.called(); }); 但是

我使用Type脚本构建一个膝关节炎API,我使用一个依赖性注入库AWILIX,使单元测试更简单。 如果我没有使用TypeScript,我会这样编写单元测试:

//设置
常量用户服务={
getUserById:sinon.stub(),
};
const userController=工厂(userService);
//示例测试
它('有效',()=>{
用户控制器();
expect(userService.getUserById.to.have.been.called();
});
但是,由于userService接口的方法不仅仅是
getUserById
,当您使用TypeScript时,会出现如下错误:

属性“insert”在类型“{getUserById:SinonSub;}”中丢失,但在类型“UserServiceInterface”中是必需的。

有没有一种方法可以绕过这个问题,而不必删除依赖项的每个方法

谢谢

您可以使用方法创建一个新对象,将给定的函数作为原型,并存根所有实现的函数

例如

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');
  }
}
import { IUserService } from './userService';

export function factory(userService: IUserService) {
  return async function userController() {
    return userService.getUserById('1');
  };
}
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);
  });
});
userController.test.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');
  }
}
import { IUserService } from './userService';

export function factory(userService: IUserService) {
  return async function userController() {
    return userService.getUserById('1');
  };
}
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)

constuserservice:any={…}
?@jornsharpe尽管userService的接口比这更严格。这将导致上面的相同错误^@jshjohnson我使用
any
尝试了这个案例,但没有得到错误这可能会有所帮助: