我们的MEANJS
应用程序有一个类(例如,CompanyService
),它加载另一个类的对象(例如,CompanyRepo
)并在其上调用方法。我正在尝试为CompanyService
类编写单元测试,并且需要在CompanyRepo
方法中存根方法来模拟承诺拒绝。但是,尽管存根,CompanyService
方法调用似乎调用了实际的CompanyRepo
方法调用。
代码流程如下,
companyService方法
function isDomainExists(domain) {
return new Promise(function(resolve, reject) {
companyRepo.getCompanyByDomain(domain)
.then(function (company) {
return resolve(company);
}, function(rejected) {
return reject("Error");
})
} });
单元测试方法
var stub = sinon.stub(companyRepo,"getCompanyByDomain").rejects("error"); it('Should return company not registered if there is a DB error', function() {
return companyService.isDomainExists("test company").should.eventually.be.rejected(); }); stub.restore();
输出
公司服务 isDomainExists方法 如果出现数据库错误,应该返回公司未注册: AssertionError:预期的承诺被拒绝,但它是通过{Object($ __,isNew,...)}
实现的。
我想我能理解这里发生的事情。 companyService类有一个require语句,用于加载companyRepo类,该类甚至在发生存根之前就会执行。有什么方法可以避免这种情况发生吗?在这种情况下,建议的最佳做法是什么?
答案 0 :(得分:0)
我无法让它与should一起正常工作,但确实让它发挥作用,看看是否有帮助:
companyService:
var companyRepo = require('./companyRepo');
function isDomainExists(domain) {
return new Promise(function (resolve, reject) {
companyRepo.getCompanyByDomain(domain)
.then(function (company) {
console.log('----in main resolve')
return resolve(company);
}, function (rejected) {
console.log('----in error catch')
// return reject(new Error('Errorx'));
return reject('Error');
});
});
};
exports.isDomainExists = isDomainExists;
companyRepo
exports.getCompanyByDomain = () => {
console.log('-----in real getCompanyByDomain');
return Promise.resolve('resolve from real function');
}
测试
it('Should return company not registered if there is a DB error', async function () {
var stub = sinon.stub(companyRepo, "getCompanyByDomain").rejects("fake_error");
await expect(companyService.isDomainExists("test company")).to.eventually.be.rejectedWith('Error');
stub.restore();
});
拒绝错误(而不是假冒错误)因为您的拒绝功能发送错误'无论。
有时应该表现得很有趣,不知道为什么还要尝试在测试中移动存根/ resotre(或者在beforeEach,afterEach之后)。
在公司的Repo定义中也有一个小错字。
如果没有其他工作(我在某些情况下已经看过这种情况),请尝试重新连接到存根:
var rewire = require('rewire')
//notice not using require here
var companyService = rewire('./companyService');
it('should stub', async () => {
let fake = {
getCompanyByDomain: () => {
console.log('------rewired stub')
return Promise.reject('rewired_error');
}
}
companyService.__set__('companyRepo', fake);
await expect(companyService.isDomainExists("test company")).to.eventually.be.rejectedWith('Error');
//reset
companyService = rewire('./companyService');
});