在函数内对 NodeJS Promise 进行单元测试
Unit testing NodeJS Promise inside a function
我正在尝试对调用 promise 的函数进行单元测试...
使用摩卡,诗乃。我有一个这样的功能块:
myfile.js:
let OuterDependecy = require('mydep');
function TestFunction(callback) {
OuterDependency.PromiseFunction().then(response => {
//some logic here
}).catch(err => {callback(err)});
在我的测试中,我使用 proxyquire 来模拟 outerdependecy
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);
});
我的实际测试现在调用 main "testfunction"
it('Catches Errors, and calls back using error', done => {
TestFunction(stubCallback);
expect(spy).to.have.been.called;
done();
});
我看到正在调用存根(控制台日志,因此我不想使用 sinon.spy)但是间谍说它没有被调用。并且单元测试失败。
我认为这可能是由于某种竞争条件导致的,在我的测试后承诺正在解决 运行... 无论如何要延迟测试直到我的承诺得到解决。
我知道在 angularjs 承诺测试中,有一种方法可以 "tick" 承诺,因此它会在您需要时解决。在 nodejs 中可能吗?
is there anyway to delay the test until my promise is resolve.
据我了解你的问题,是的,你应该只在 promise 解决后才调用 done()
。为此,您需要两件事:
1- 执行 TestFunction
到 return 一个 Promise,所以你可以等到它解决:
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 块触发并且回调被触发),期望和完成的调用总是在回调被调用后触发。
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
出现在下一个规范中。
我正在尝试对调用 promise 的函数进行单元测试...
使用摩卡,诗乃。我有一个这样的功能块:
myfile.js:
let OuterDependecy = require('mydep');
function TestFunction(callback) {
OuterDependency.PromiseFunction().then(response => {
//some logic here
}).catch(err => {callback(err)});
在我的测试中,我使用 proxyquire 来模拟 outerdependecy
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);
});
我的实际测试现在调用 main "testfunction"
it('Catches Errors, and calls back using error', done => {
TestFunction(stubCallback);
expect(spy).to.have.been.called;
done();
});
我看到正在调用存根(控制台日志,因此我不想使用 sinon.spy)但是间谍说它没有被调用。并且单元测试失败。
我认为这可能是由于某种竞争条件导致的,在我的测试后承诺正在解决 运行... 无论如何要延迟测试直到我的承诺得到解决。
我知道在 angularjs 承诺测试中,有一种方法可以 "tick" 承诺,因此它会在您需要时解决。在 nodejs 中可能吗?
is there anyway to delay the test until my promise is resolve.
据我了解你的问题,是的,你应该只在 promise 解决后才调用 done()
。为此,您需要两件事:
1- 执行 TestFunction
到 return 一个 Promise,所以你可以等到它解决:
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 块触发并且回调被触发),期望和完成的调用总是在回调被调用后触发。
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
出现在下一个规范中。