cyb*_*bat 13 javascript mocha.js promise bluebird chai-as-promised
我有一个拒绝承诺的课程:
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;
});
};
Run Code Online (Sandbox Code Playgroud)
在我的测试中:
return expect(s.sendNote(data)).to.eventually.be.rejectedWith('Boo');
Run Code Online (Sandbox Code Playgroud)
但是,当测试通过时,它会将错误抛出到控制台.
未处理的拒绝错误:嘘......
对于非promise错误,我使用bind来测试以防止在Chai可以包装和测试之前抛出错误:
return expect(s.sendNote.bind(s, data)).to.eventually.be.rejectedWith('Boo');
Run Code Online (Sandbox Code Playgroud)
但是这不适用于此并返回:
类型错误: [Function] is not a thenable.
测试这个的正确方法是什么?
fea*_*ool 18
(免责声明:即使是那些不使用Bluebird的人也是一个很好的问题.我在这里发布了类似的答案;这个答案适用于那些没有使用Bluebird的人.)
以下是如何使用chai-as-promised来测试Promise的两种情况resolve
和reject
案例:
var chai = require('chai');
var expect = chai.expect;
var chaiAsPromised = require("chai-as-promised");
chai.use(chaiAsPromised);
...
it('resolves as promised', function() {
return expect(Promise.resolve('woof')).to.eventually.equal('woof');
});
it('rejects as promised', function() {
return expect(Promise.reject('caw')).to.be.rejectedWith('caw');
});
Run Code Online (Sandbox Code Playgroud)
你可以完成同样的事情,而不像这样承诺:
it('resolves as promised', function() {
return Promise.resolve("woof")
.then(function(m) { expect(m).to.equal('woof'); })
.catch(function(e) { throw e }) // use error thrown by test suite
;
});
it('rejects as promised', function() {
return Promise.reject("caw")
.then(function(m) { throw new Error('was not supposed to succeed'); })
.catch(function(m) { expect(m).to.equal('caw'); })
;
});
Run Code Online (Sandbox Code Playgroud)
我个人使用那个成语:
it('rejects as promised', function() {
return Promise.reject("caw")
.then(
(m) => { assert.fail('was not supposed to succeed'); }
(m) => { /* some extra tests here */ }
);
});
Run Code Online (Sandbox Code Playgroud)
这是极少数情况then(onFulfilled, onRejected)
(2个参数)合法使用之一.
如果你.then(reject).catch(onRejected)
按照其他答案的建议进行链接,你最终每次进入catch
处理程序,因为它会捕获前面处理程序中产生的拒绝- 如果你不够仔细检查那种可能性,这可能会导致常青测试.then
您收到错误是因为sendNote被拒绝并且您没有捕获它。
尝试:
var callPromise = self.doCall('POST', '/Invoice', {
Invoice: data
}).then(function(res) {
return data;
});
callPromise.catch(function(reason) {
console.info('sendNote failed with reason:', reason);
});
return callPromise;
Run Code Online (Sandbox Code Playgroud)
看起来您还必须将现有渔获移出一个街区:
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');
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
20097 次 |
最近记录: |