如果我将sinon与打字稿一起使用,那么如何将sinon mock转换为我的对象的实例呢?
例如,会返回一个SinonMock但我的测试控制器可能需要传递给它的构造函数的特定服务。
var myServiceMock: MyStuff.MyService = <MyStuff.MyService (sinon.mock(MyStuff.MyService));
controllerUnderTest = new MyStuff.MyController(myServiceMock, $log);
sinon可以和Typescript一起使用吗?
答案 0 :(得分:16)
如果使用mock
方法,而不是createStubInstance
,则Sinon可以非常轻松地基于构造函数创建存根。
使用mocha,chai,sinon和sinon-chai的示例可能如下所示:
import * as sinon from 'sinon';
import * as chai from 'chai';
// ... imports for the classes under test
const expect = chai.expect;
const sinonChai = require("sinon-chai");
chai.use(sinonChai);
describe('MyController', () => {
it('uses MyService', () => {
let myService = sinon.createStubInstance(MyStuff.MyService),
controller = new MyStuff.MyController(myService as any, ...);
// ... perform an action on the controller
// that calls myService.aMethodWeAreInterestedIn
// verify if the method you're interested in has been called if you want to
expect(myService.aMethodWeAreInterestedIn).to.have.been.called;
});
});
我published an article,如果您想了解更多关于不同测试双打以及如何将它们与Sinon.js一起使用的话,您可能会觉得有用。
希望这有帮助!
扬
答案 1 :(得分:13)
在将范围缩小到特定类型之前,您可能需要使用<any>
类型断言来使类型变宽:
var myServiceMock: MyStuff.MyService =
<MyStuff.MyService> <any> (sinon.mock(MyStuff.MyService));
只是为了澄清一个sinon的行为 - 虽然你传入MyStuff.MyService
,但是你传递给mock
方法的任何内容仅用于提供更好的错误消息。
如果您希望模拟具有方法和属性you need to add them。
如果你想要自动创建假货,你可以从tsUnit抓取FakeFactory
,这会创建一个假的版本,其中包含一些你可以选择覆盖的默认值 - 在JavaScript中这是非常简单的东西(加上不使用太多的模拟功能,你可以确保你测试行为而不是实现。)
使用FakeFactory
:
var target = tsUnit.FakeFactory.getFake<RealClass>(RealClass);
var result = target.run();
this.areIdentical(undefined, result);
答案 2 :(得分:1)
在Typescript中,可以使用sinon.createStubInstance和SinonStubbedInstance类来实现。
示例:
let documentRepository: SinonStubbedInstance<DocumentRepository>;
documentRepository = sinon.createStubInstance(DocumentRepository);
现在,您具有使用此类的所有存根方法的完整智能。
示例排列:
documentRepository.delete.resolves({deletedCount: 1});
documentRepository.update.throws(error);
断言示例:
sinon.assert.calledOnce(documentRepository.update);
只有一个地方需要执行类型转换,这就是要进行单元测试的类的初始化。
示例:
documentsController =
new DocumentsController(
userContext,
documentRepository as unknown as DocumentRepository);
希望这会有所帮助。 有关article的更多信息。
答案 3 :(得分:0)