我正在尝试对调用 promise 的函数进行单元测试...
使用 Mocha,Sinon。我有一个这样的功能 block :
我的文件.js:
let OuterDependecy = require('mydep');
function TestFunction(callback) {
OuterDependency.PromiseFunction().then(response => {
//some logic here
}).catch(err => {callback(err)});
在我的测试中,我使用了 proxyquire模拟外部依赖
测试文件.js
let proxyquire = require('proxyquire');
let OuterDepStub = {};
let testingFunc = proxyquire('myfile.js', {'mydep': OuterDepStub});
...然后在我的测试 block 中
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();
});
我看到 stub 被调用(控制台日志,因此我不想使用 sinon.spy)但是 spy 说它没有被调用。并且单元测试失败。
我相信这可能是由于某种竞争条件导致的,在我的测试运行后 promise 正在解决......无论如何要延迟测试直到我的 promise 得到解决。
我知道在 angularjs promise 测试中,有一种方法可以“勾选” promise ,以便在您需要时解决。可能在 nodejs 中?
最佳答案
-
is there anyway to delay the test until my promise is resolve.
据我了解你的问题,是的,你应该只调用 done()
在 promise 解决后。为此,您需要两件事:
1- 强制 TestFunction
返回一个 Promise,这样你就可以等到它解决:
function TestFunction(callback) {
return OuterDependency.PromiseFunction().then(response => {
//some logic here
}).catch(err => { callback(err) });
}
2- 等待 promise 完成,然后调用done
。
it('Catches Errors, and calls back using error', done => {
TestFunction(stubCallback).then(() => {
expect(spy).to.have.been.called;
done();
})
});
现在,我们的 then
block 直到 TestFunction
中的 catch
block 才会运行,所以如果测试按预期工作(即catch block 触发并触发回调),期望和完成的调用将始终在回调被调用后触发。
-
I see the stub being called (the console log, hence why i didnt want to use sinon.spy) but the spy is saying its not called. and unit test fails.
那是因为您的预期会在 TestFunction
调用之后立即运行,而不是等待它稳定下来。但是,它最近将被调用,因此 console.log
出现在下一个规范中。
关于javascript - 在函数内对 NodeJS Promise 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47554438/