我如何将 Sinon 与 Typescript 一起使用?
How do I use Sinon with Typescript?
如果我将 sinon 与 typescript 一起使用,那么如何将 sinon mock 转换为我的对象实例?
例如,将返回一个 SinonMock,但我的被测控制器可能需要将特定服务传递给它的构造函数。
var myServiceMock: MyStuff.MyService = <MyStuff.MyService (sinon.mock(MyStuff.MyService));
controllerUnderTest = new MyStuff.MyController(myServiceMock, $log);
sinon 可以和 Typescript 一起使用吗?
在将类型缩小为特定类型之前,您可能需要使用 <any>
类型断言来扩大类型:
var myServiceMock: MyStuff.MyService =
<MyStuff.MyService> <any> (sinon.mock(MyStuff.MyService));
只是为了澄清 sinon 的一种行为 - 尽管您传入 MyStuff.MyService
,但您传递给 mock
方法的任何内容仅用于提供更好的错误消息。
如果您希望 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);
如果您使用 createStubInstance
方法而不是 mock
,Sinon 可以很容易地创建基于构造函数的存根。
使用 mocha, chai, sinon and 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 一起使用,您可能会发现它很有用。
希望对您有所帮助!
一月
在 Typescript 中,这可以通过使用 sinon.createStubInstance 和 SinonStubbedInstance class.
来实现
示例:
let documentRepository: SinonStubbedInstance<DocumentRepository>;
documentRepository = sinon.createStubInstance(DocumentRepository);
现在您有一个完整的智能感知来处理这个 class 的所有存根方法。
示例排列:
documentRepository.delete.resolves({deletedCount: 1});
documentRepository.update.throws(error);
示例断言:
sinon.assert.calledOnce(documentRepository.update);
只有一个地方需要执行类型转换,那就是 class 要进行单元测试的初始化。
示例:
documentsController =
new DocumentsController(
userContext,
documentRepository as unknown as DocumentRepository);
希望这会有所帮助。
有关此内容的更多信息 article。
使用ts-sinon。
它让你:
- 存根对象
- 存根接口
如果我将 sinon 与 typescript 一起使用,那么如何将 sinon mock 转换为我的对象实例?
例如,将返回一个 SinonMock,但我的被测控制器可能需要将特定服务传递给它的构造函数。
var myServiceMock: MyStuff.MyService = <MyStuff.MyService (sinon.mock(MyStuff.MyService));
controllerUnderTest = new MyStuff.MyController(myServiceMock, $log);
sinon 可以和 Typescript 一起使用吗?
在将类型缩小为特定类型之前,您可能需要使用 <any>
类型断言来扩大类型:
var myServiceMock: MyStuff.MyService =
<MyStuff.MyService> <any> (sinon.mock(MyStuff.MyService));
只是为了澄清 sinon 的一种行为 - 尽管您传入 MyStuff.MyService
,但您传递给 mock
方法的任何内容仅用于提供更好的错误消息。
如果您希望 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);
如果您使用 createStubInstance
方法而不是 mock
,Sinon 可以很容易地创建基于构造函数的存根。
使用 mocha, chai, sinon and 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 一起使用,您可能会发现它很有用。
希望对您有所帮助!
一月
在 Typescript 中,这可以通过使用 sinon.createStubInstance 和 SinonStubbedInstance class.
来实现示例:
let documentRepository: SinonStubbedInstance<DocumentRepository>;
documentRepository = sinon.createStubInstance(DocumentRepository);
现在您有一个完整的智能感知来处理这个 class 的所有存根方法。
示例排列:
documentRepository.delete.resolves({deletedCount: 1});
documentRepository.update.throws(error);
示例断言:
sinon.assert.calledOnce(documentRepository.update);
只有一个地方需要执行类型转换,那就是 class 要进行单元测试的初始化。
示例:
documentsController =
new DocumentsController(
userContext,
documentRepository as unknown as DocumentRepository);
希望这会有所帮助。 有关此内容的更多信息 article。
使用ts-sinon。
它让你:
- 存根对象
- 存根接口