我有一个拒绝承诺的课程:
Sync.prototype.doCall = function(verb, method, data) {
var self = this;
self.client = P.promisifyAll(new Client());
var res = this.queue.then(function() {
return self.client.callAsync(verb, method, data)
.then(function(res) {
return;
})
.catch(function(err) {
// This is what gets called in my test
return P.reject('Boo');
});
});
this.queue = res.delay(this.options.throttle * 1000);
return res;
};
Sync.prototype.sendNote = function(data) {
var self = this;
return self.doCall('POST', '/Invoice', {
Invoice: data
}).then(function(res) {
return data;
});
};
在我的测试中:
return expect(s.sendNote(data)).to.eventually.be.rejectedWith('Boo');
但是,当测试通过时,它会将错误抛出到控制台 .
未处理的拒绝错误:嘘......
对于非promise错误,我使用bind来测试以防止在Chai可以包装和测试之前抛出错误:
return expect(s.sendNote.bind(s, data)).to.eventually.be.rejectedWith('Boo');
但是这不适用于此并返回:
TypeError: [Function] is not a thenable.
测试这个的正确方法是什么?
4 回答
我个人使用那个成语:
这是极少数情况下
then(onFulfilled, onRejected)
(2个参数)合法使用的情况之一 .如果你按照其他答案中的建议链接
.then(reject).catch(onRejected)
,你每次都会进入catch
处理程序,因为它会捕获前面的then
处理程序中产生的拒绝 - 如果你不够仔细检查,可能会导致常绿测试那种可能性 .您收到错误是因为sendNote被拒绝而您没有 grab 它 .
尝试:
看起来你还必须将现有的一个块移出:
(免责声明:即使是那些不使用Bluebird的人,这也是一个很好的问题 . 我发布了类似的答案here;这个答案适用于那些没有使用Bluebird的人 . )
与chai-as-promise
以下是如何使用chai-as-promise来测试Promise的
resolve
和reject
个案:没有柴 - 承诺
你可以完成同样的事情,而不像这样承诺:
我遇到了同样的问题,但在做了很多黑客攻击时,我找到了一个用于测试mocha中被拒绝的承诺的解决方案 .
write mocha code as below
注意: - 希望您觉得它很有用 . 如果你有另一个想法建议,请评论我,我是新手探索js世界