在 Mocha/Chai 中测试被拒绝的承诺
Testing rejected promise in Mocha/Chai
我有一个 class 拒绝承诺:
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');
然而,当测试通过时,它会向控制台抛出错误。
未处理的拒绝错误:Boo
...
对于非承诺错误,我使用绑定来测试以防止在 Chai 可以包装和测试之前抛出错误:
return expect(s.sendNote.bind(s, data)).to.eventually.be.rejectedWith('Boo');
但是这不适用于 this 和 returns:
类型错误:[Function] is not a thenable.
正确的测试方法是什么?
您收到错误是因为 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;
看来您还必须将现有的渔获物移出一个街区:
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');
});
(免责声明:即使对于不使用 Bluebird 的人来说,这也是一个很好的问题。我发布了一个类似的答案 here;此答案适用于不使用 Bluebird 的人。)
与 chai-as-promised
以下是如何使用 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');
});
没有承诺的柴
你可以像这样在没有 chai-as-promised 的情况下完成同样的事情:
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'); })
;
});
我遇到过同样的问题,但经过多次修改后,我找到了在 mocha 中测试被拒绝承诺的解决方案。
编写mocha代码如下
it('works with resolved and rejected promises', function() {
return yourPromiseFunction("paramifrequired")
.then((result)=>{
//check with should or expect
}).catch((result)=>{
//check with should or expect whether it's rejected with proper result status. set result status in promise function while rejecting accordingly
})
});
注意:- 希望您觉得它有用。如果您有其他想法建议,请评论我,我是探索 js 世界的新手
我个人使用那个成语:
it('rejects as promised', function() {
return Promise.reject("caw")
.then(
(m) => { assert.fail('was not supposed to succeed'); }
(m) => { /* some extra tests here */ }
);
});
这是少数情况之一 then(onFulfilled, onRejected)
(2 个参数)可以合法使用。
如果你按照其他答案中的建议链接 .then(reject).catch(onRejected)
,你最终会进入 catch
处理程序 每次 因为它也会捕获在前面的 then
处理程序中产生了拒绝——如果您不够小心检查这种可能性,这可能会导致常绿测试。
我有一个 class 拒绝承诺:
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');
然而,当测试通过时,它会向控制台抛出错误。
未处理的拒绝错误:Boo ...
对于非承诺错误,我使用绑定来测试以防止在 Chai 可以包装和测试之前抛出错误:
return expect(s.sendNote.bind(s, data)).to.eventually.be.rejectedWith('Boo');
但是这不适用于 this 和 returns:
类型错误:[Function] is not a thenable.
正确的测试方法是什么?
您收到错误是因为 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;
看来您还必须将现有的渔获物移出一个街区:
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');
});
(免责声明:即使对于不使用 Bluebird 的人来说,这也是一个很好的问题。我发布了一个类似的答案 here;此答案适用于不使用 Bluebird 的人。)
与 chai-as-promised
以下是如何使用 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');
});
没有承诺的柴
你可以像这样在没有 chai-as-promised 的情况下完成同样的事情:
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'); })
;
});
我遇到过同样的问题,但经过多次修改后,我找到了在 mocha 中测试被拒绝承诺的解决方案。
编写mocha代码如下
it('works with resolved and rejected promises', function() {
return yourPromiseFunction("paramifrequired")
.then((result)=>{
//check with should or expect
}).catch((result)=>{
//check with should or expect whether it's rejected with proper result status. set result status in promise function while rejecting accordingly
})
});
注意:- 希望您觉得它有用。如果您有其他想法建议,请评论我,我是探索 js 世界的新手
我个人使用那个成语:
it('rejects as promised', function() {
return Promise.reject("caw")
.then(
(m) => { assert.fail('was not supposed to succeed'); }
(m) => { /* some extra tests here */ }
);
});
这是少数情况之一 then(onFulfilled, onRejected)
(2 个参数)可以合法使用。
如果你按照其他答案中的建议链接 .then(reject).catch(onRejected)
,你最终会进入 catch
处理程序 每次 因为它也会捕获在前面的 then
处理程序中产生了拒绝——如果您不够小心检查这种可能性,这可能会导致常绿测试。