Сжатие JavaScript-конструктора с Sinon.JS
Я хотел бы unit test следующий класс 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, чтобы издеваться над getEvents
из internalService
, чтобы протестировать getData
?
Я посмотрел Javascript: Mocking Constructor с помощью Sinon, но не смог извлечь решение.
// 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);
});
});
Ответы
Ответ 1
Вы можете создать пространство имен или создать экземпляр заглушки, используя sinon.createStubInstance
(это не вызовет конструктор).
Создание пространства имен:
const namespace = {
Service: require('./service')
};
describe('Service', function() {
it('getData', function() {
sinon.stub(namespace, 'Service').returns(0);
console.log(new namespace.Service()); // Service {}
});
});
Создание экземпляра заглушки:
let Service = require('./service');
describe('Service', function() {
it('getData', function() {
let stub = sinon.createStubInstance(Service);
console.log(stub); // Service {}
});
});
Ответ 2
Так как sinon.createStubInstance
был удален из последних версий Sinon, я бы предложил обмануть отдельные методы экземпляра на прототипе, чтобы добиться желаемого эффекта. Что-то вроде этого:
const spy = sinon.stub(InternalService.prototype, 'getEvents').returns([{ id: 1 }]);
const internalService = new InternalService();
console.log(internalService.getEvents());
// => [{ id: 1 }]