[英]Injecting a stubbed dependency into an es6 class with Sinon
我有以下模塊:
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;
在上文中,我想測試方法getDummies
與興農。 到目前為止,我的方法是將dummiesRepository
存根,並在實例化期間將其注入到我的dummiesRepository
服務中,但是我遇到了錯誤。 這是我的測試結果:
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);
});
});
該測試失敗,並顯示錯誤TypeError: this.dummiesRepository.getDummiesData is not a function
。 我不確定為什么這不起作用,我將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
作為參數,一切正常。
這行得通,但是我仍然想知道是否有一種通過構造函數注入依賴關系的方法,因為這種方法需要我重構很多代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.