[英]How to catch deferred.reject using supertest and chai?
我正在使用 supertest、chai 和 mocha 来测试我的 Web API 应用程序。 我有以下代码:
it('should return 500', function(done) {
this.timeout(30000);
request(server)
.get('/some/path')
.expect(500)
.end(function(err, res) {
done();
});
});
它应该失败。 在get
请求中运行的代码是:
// Inside method getData
try {
// Get data
// throws error
} catch (e) {
// catches error and displays it
deferred.reject(e);
return deferred.promise;
}
// Other code not in getData method
dbOps.params.getData(collection, parameter, query).then(
function (arr) {
response.send(arr);
}, function (err) {
logger.error(err.message);
response.status(500).send(err.message);
}
);
它基本上是deferred.reject(e);
并将错误作为 API 的响应发送。 我想赶上deferred.reject(e);
部分并同时继续.except(500).end(...).
就像是:
catch_deferred(request(server).get('/some/path'))
.expect(500)
.end(function(err, res) {
expect(err).to.equal(null);
expect(res.body).to.be.an('object').that.is.empty;
done();
有什么办法吗? 我不能使用 try-catch 块,因为它不是例外。 我也不能 chai 的expect().to.throw()
因为没有抛出异常。
免责声明:我从不使用 deferred.reject()。
可能的解决方案:使用sinon 。
如果您希望真正的 deferred.reject()运行并且您只想监视它,您可以使用spy 。 监控的意思是:知道方法是否被调用,使用什么参数,以及返回值。 例子:
// Preparation: (Disclaimer: I never use Deferred.reject())
const spyDeferredReject = sinon.spy(Deferred, 'reject');
// Do stuff..
// Expectation phase: check whether deferred reject get called.
expect(spyDeferredReject.calledOnce).to.equal(true);
// Check whether deferred reject called with correct argument.
expect(spyDeferredReject.args[0][0]).to.be.an('error');
如果要监视它并确保不调用真正的方法,可以使用stub 。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.