我使用mocha和chai进行测试。
我有一个函数,它接受另一个函数并绕过它,并在调用.call()
方法时执行其他一些操作时调用它。
let tracker = trackerFactory({
watchFunction: somefunction
})
tracker.call() //does some things, calls somefunction, does more things...
现在我试图测试它来处理一个函数,当函数返回一个拒绝的承诺时。
it("handles a rejection by the watched function", (done) => {
let tracker = trackerFactory({
watchFunction: () => {
Promise.reject(new Error("random error"))
}
})
expect(function() {
tracker.call();
}).to.not.throw("random error");
done();
})
最终,这个测试应该通过,但我正在做TDD所以我还没有实现处理拒绝的机制。问题是,即使节点显示警告,该测试也会通过:
✓ handles a rejection by the watched function
(node:4347) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: random error
(node:4347) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
所以我的问题是,如何测试显示此警告的案例?或者,换句话说,我如何测试函数内部是否存在未处理的拒绝?
答案 0 :(得分:0)
即使使用TDD,因为您知道测试是针对承诺拒绝的,所以您可以从watchFunction实现承诺拒绝,如下所示:
return new Promise(function (resolve, reject) {
if (true)
resolve();
else
// throw new Error("Promise rejected")
reject();
});
这只是一个尚未实现的承诺的模板,就像throw new MethodNotImplemented
例外一样。
在测试中,处理承诺拒绝,就像这样,
it("handles Promise rejection",async ()=>{
await watchFunction().then(function () {
console.log("Promise Resolved");
}).catch((error)=>{
console.log("Promise rejected")
// assert.equal(error.message,"Promise rejected")
})
答案 1 :(得分:0)
这是我最终做的,我觉得这个解决方案非常舒服:
我使用了chai-as-promised并编辑了我的测试代码:
it("handles a rejection by the watched function", () => {
let tracker = trackerFactory({
watchFunction: () => {
return Promise.reject(new Error("random error"))
}
})
return tracker.call().should.be.fulfilled;
})
如果tracker.call()
没有返回Promise,或者它返回了无法解析的promise,则会失败。