Javascript 使用Sinon将存根依赖项注入es6类
我有以下模块:Javascript 使用Sinon将存根依赖项注入es6类,javascript,mocha.js,sinon,stub,es6-class,Javascript,Mocha.js,Sinon,Stub,Es6 Class,我有以下模块: const rp = require('request-promise'); // dummies.repository.js exports.getDummiesData = () => { const options = { url: 'https://api.github.com/users', headers: { 'User-Agent': 'Request-Promise', }, json: true
const rp = require('request-promise');
// dummies.repository.js
exports.getDummiesData = () => {
const options = {
url: 'https://api.github.com/users',
headers: {
'User-Agent': 'Request-Promise',
},
json: true
};
return rp(options)
.then(r => r)
.catch(err => { throw err; });
}
上面的文件是我想要测试的类的依赖项。我通过其构造函数将其注入到下面的类中,如下所示:
// dummies.service.js
const Dummies = require('./dummies.model');
class DummiesService {
constructor(dummiesRepository) {
this.dummiesRepository = dummiesRepository;
}
getDummies() {
return new Promise((resolve, reject) => {
this.dummiesRepository.getDummiesData()
.then((response) => {
// business logic
const dummies = response.map(d => new Dummies(d));
resolve(dummies);
})
.catch((response) => {
reject(response);
});
});
}
}
module.exports = DummiesService;
在上面,我想用sinon测试方法getDummies
。到目前为止,我的方法是剔除dummiesRepository
,并在实例化期间将其注入到我的dummies服务中,但我遇到了一个错误。以下是我的测试结果:
const DummiesService = require('../dummies.service');
const dummiesRepository = require('../dummies.repository');
let dummiesRepositoryStub;
afterEach(() => {
if(dummiesRepositoryStub){
dummiesRepositoryStub.restore();
}
});
describe('unit: dummies.service - when getting dummies data', () => {
it('it should resolve and return dummies data', () => {
const dummiesResponse = [
{ id: 1, login: 'dummy1', additionalData: 'data' },
{ id: 2, login: 'dummy2', additionalData: 'data' },
{ id: 3, login: 'dummy3', additionalData: 'data' },
];
dummiesRepositoryStub = sinon
.stub(dummiesRepository, 'getDummiesData')
.resolves(dummiesResponse);
dummiesService = new DummiesService(dummiesRepositoryStub);
// act + assert
return dummiesService.getDummies()
.then((response) => {
chai.expect(dummiesRepositoryStub.called).to.equal(true);
chai.expect(response).to.deep.equal(dummiesTransformedModel);
});
});
此测试失败,错误为
类型错误:This.dummiesRepository.getDummiesData不是函数。我不确定这为什么不起作用,我将dummiesRepository的存根实现注入到DummiesService
类中。请帮忙 在上面的代码中,我找不到一种方法来进行构造函数注入,但我找到了一种变通方法,允许sinon存根我的方法
我不得不将dummyRepository
从构造函数依赖项删除为仅使用require
来包含它。如果代码如下所示
const Dummies = require('./dummies.model');
const dummiesRepository = require('./dummies.repository');
class DummiesService {
constructor() {
this.dummiesRepository = dummiesRepository;
}
getDummies() {
return new Promise((resolve, reject) => {
this.dummiesRepository.getDummiesData()
.then((response) => {
// business logic
const dummies = response.map(d => new Dummies(d));
resolve(dummies);
})
.catch((response) => {
reject(response);
});
});
}
}
module.exports = DummiesService;
测试的编写与上面相同,但是实例化DummyService
而不使用dummyRepositoryStub
作为参数,一切正常
这是可行的,但我仍然想知道是否有办法通过构造函数注入依赖项,因为这种方法需要我重构大量代码 在上面的代码中,我找不到一种方法来进行构造函数注入,但我找到了一种变通方法,允许sinon存根我的方法
我不得不将dummyRepository
从构造函数依赖项删除为仅使用require
来包含它。如果代码如下所示
const Dummies = require('./dummies.model');
const dummiesRepository = require('./dummies.repository');
class DummiesService {
constructor() {
this.dummiesRepository = dummiesRepository;
}
getDummies() {
return new Promise((resolve, reject) => {
this.dummiesRepository.getDummiesData()
.then((response) => {
// business logic
const dummies = response.map(d => new Dummies(d));
resolve(dummies);
})
.catch((response) => {
reject(response);
});
});
}
}
module.exports = DummiesService;
测试的编写与上面相同,但是实例化DummyService
而不使用dummyRepositoryStub
作为参数,一切正常
这是可行的,但我仍然想知道是否有办法通过构造函数注入依赖项,因为这种方法需要我重构大量代码 第一行缺少单引号<代码>常数rp=要求(‘请求-承诺’)代码>应该是const rp=require('request-promise')代码>谢谢,但这不是我的错误。我只是打错了第一行的问题缺少一句话<代码>常数rp=要求(‘请求-承诺’)代码>应该是const rp=require('request-promise')代码>谢谢,但这不是我的错误。我刚才打错了问题