我试图对一个调用承诺的函数进行单元测试......
使用Mocha,Sinon。我有一个像这样的功能块:
myfile.js:
let OuterDependecy = require('mydep');
function TestFunction(callback) {
OuterDependency.PromiseFunction().then(response => {
//some logic here
}).catch(err => {callback(err)});
在我的测试中,我使用proxyquire来模拟外部依赖性
testfile.js
let proxyquire = require('proxyquire');
let OuterDepStub = {};
let testingFunc = proxyquire('myfile.js', {'mydep': OuterDepStub});
...然后在我的测试块中
let stubCallback = function() {
console.log('Stub dubadub dub'); //note...i can use sinon.spy here instead
};
beforeEach(()=>{
OuterDependency.PromiseFunction = function(arg) {
return new Promise((resolve, reject)=>{
reject('BAD');
});
};
spy = sinon.spy(stubCallback);
});
我的实际测试现在调用主要的“testfunction”
it('Catches Errors, and calls back using error', done => {
TestFunction(stubCallback);
expect(spy).to.have.been.called;
done();
});
我看到被调用的存根(控制台日志,因此我不想使用sinon.spy),但是间谍说它没有被调用。单元测试失败。
我认为这可能是由于竞争条件导致我的测试结束后承诺得到解决...无论如何都要推迟测试,直到我的承诺得到解决。
我知道在angularjs承诺测试中,有一种方法可以“勾选”这个承诺,以便它可以在你想要的时候解决。在nodejs中可能吗?
答案 0 :(得分:1)
无论如何都要推迟测试,直到我的承诺得到解决。
据我了解您的问题,是的,您只应在承诺解决后致电done()
。为此,您需要做两件事:
1-强制TestFunction
返回承诺,以便您可以等到结算:
function TestFunction(callback) {
return OuterDependency.PromiseFunction().then(response => {
//some logic here
}).catch(err => { callback(err) });
}
2-等待该承诺解决,然后致电done
。
it('Catches Errors, and calls back using error', done => {
TestFunction(stubCallback).then(() => {
expect(spy).to.have.been.called;
done();
})
});
现在,我们的then
块在catch
内的TestFunction
块之前不会运行,所以如果测试按预期工作(即catch块触发并且回调被触发) ,在调用回调后,期望和完成的调用将始终触发。
我看到被调用的存根(控制台日志,因此我不想使用sinon.spy),但是间谍说它没有被调用。单元测试失败。
这是因为你的期望在TestFunction
电话之后立即运行,而不是等待它解决。但是, 最近会被调用,因此console.log
会显示在下一个规范中。