如何将Sinon与Typescript一起使用?

Bra*_*don 22 unit-testing sinon typescript

如果我将sinon与typescript一起使用,那么如何将sinon mock转换为我的对象的实例?

例如,将返回SinonMock,但我的测试控制器可能需要传递给其构造函数的特定服务.

var myServiceMock: MyStuff.MyService = <MyStuff.MyService (sinon.mock(MyStuff.MyService));

controllerUnderTest = new MyStuff.MyController(myServiceMock, $log);
Run Code Online (Sandbox Code Playgroud)

sinon可以和Typescript一起使用吗?

Jan*_*lak 19

如果mock您使用该createStubInstance方法,Sinon可以非常轻松地基于构造函数创建存根.

使用mocha,chai,sinonsinon-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;
    });
});
Run Code Online (Sandbox Code Playgroud)

发表了一篇文章,如果您想了解更多关于不同测试双打以及如何将它们与Sinon.js一起使用的话,您可能会发现这些文章很有用.

希望这可以帮助!

一月

  • 你也可以使用'import*as sinonChai from'sinon-chai';`假设你已经安装了类型:`npm i --save-dev @ types/sinon-chai`. (3认同)

Fen*_*ton 16

<any>在将范围缩小到特定类型之前,可能需要使用类型断言来使类型变宽:

var myServiceMock: MyStuff.MyService = 
    <MyStuff.MyService> <any> (sinon.mock(MyStuff.MyService));
Run Code Online (Sandbox Code Playgroud)

只是为了澄清一个sinon的行为 - 虽然你传入MyStuff.MyService,但是你传递给mock方法的任何东西只用于提供更好的错误消息.

如果您希望mock具有方法和属性,则需要添加它们.

如果你想自动创建假货,你可以FakeFactorytsUnit中获取,它会创建一个带有一些默认值的虚假版本,你可以选择覆盖 - 在JavaScript中这是非常简单的东西(加上不使用太多的模拟功能,你可以确保你正在测试行为而不是实现).

使用示例FakeFactory:

var target = tsUnit.FakeFactory.getFake<RealClass>(RealClass);
var result = target.run();
this.areIdentical(undefined, result);
Run Code Online (Sandbox Code Playgroud)


小智 7

使用ts-sinon

它可以让您:

  • 存根对象
  • 存根接口


小智 5

在 Typescript 中,这可以通过使用 sinon.createStubInstance 和 SinonStubbedInstance 类来实现。

例子:

let documentRepository: SinonStubbedInstance<DocumentRepository>;

documentRepository = sinon.createStubInstance(DocumentRepository);
Run Code Online (Sandbox Code Playgroud)

现在您拥有了完整的智能感知,可以使用此类的所有存根方法。

排列示例:

documentRepository.delete.resolves({deletedCount: 1});

documentRepository.update.throws(error);
Run Code Online (Sandbox Code Playgroud)

断言示例:

sinon.assert.calledOnce(documentRepository.update);
Run Code Online (Sandbox Code Playgroud)

只有一处需要执行类型转换,那就是要进行单元测试的类的初始化。

例子:

documentsController =
  new DocumentsController(
    userContext,
    documentRepository as unknown as DocumentRepository);
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助。更多关于这篇文章