嘲笑与Sinon.JS的JavaScript构造函数

我想unit testing下面的ES6类:

// service.js const InternalService = require('internal-service'); class Service { constructor(args) { this.internalService = new InternalService(args); } getData(args) { let events = this.internalService.getEvents(args); let data = getDataFromEvents(events); return data; } } function getDataFromEvents(events) {...} module.exports = Service; 

如何模拟与Sinon.JS构造函数为了模拟getEventsinternalServicetestinggetData

我看着JavaScript:使用Sinon的嘲笑构造,但无法提取解决scheme。

 // test.js const chai = require('chai'); const sinon = require('sinon'); const should = chai.should(); let Service = require('service'); describe('Service', function() { it('getData', function() { // throws: TypeError: Attempted to wrap undefined property Service as function sinon.stub(Service, 'Service').returns(0); }); }); 

您可以创build一个名称空间,或使用sinon.createStubInstance创build一个存根实例(这不会调用构造函数)。

创build一个名字空间:

 const namespace = { Service: require('./service') }; describe('Service', function() { it('getData', function() { sinon.stub(namespace, 'Service').returns(0); console.log(new namespace.Service()); // Service {} }); }); 

创build存根实例:

 let Service = require('./service'); describe('Service', function() { it('getData', function() { let stub = sinon.createStubInstance(Service); console.log(stub); // Service {} }); }); 

由于sinon.createStubInstance已经从最新版本的Sinon中删除,所以我会build议在原型上对单个实例方法进行存根,以达到预期的效果。 像这样的东西:

 const spy = sinon.stub(InternalService.prototype, 'getEvents').returns([{ id: 1 }]); const internalService = new InternalService(); console.log(internalService.getEvents()); // => [{ id: 1 }]