我无法捕获到Node中并在mocha中捕获的错误。 请帮忙!
节点: 引发错误的节点代码
app.put('/reviews/:id', (req, res) => {
var db = req.db;
Review.findById(req.params.id, 'title description', function (error, review) {
if (error) {
// console.error(error);
throw new Error('some error');
}
review.title = req.body.title;
review.description = req.body.description;
review.save(function (error) {
if (error) {
console.log(error)
}
res.send({
success: true
})
})
})
})
摩卡咖啡: 摩卡测试
it('should throw exception for incorrect id', function (done) {
let updateReview = {
title: 'Updated Title',
description: 'Updated Description'
};
chai.request(app)
.get('/reviews')
.end(function (err, res) {
chai.request(app)
.put('/reviews/12')
.send(updateReview)
.end(function (err, res) {
expect(app).to.throw(Error);
done();
});
});
});
错误: 控制台出错。
未捕获的错误:某些错误
答案 0 :(得分:3)
您不能指望在HTTP调用结束时抛出错误。
您可以通过添加响应而不是引发行来测试特定请求的返回码,如下所示:
app.put('/reviews/:id', (req, res) => {
var db = req.db;
Review.findById(req.params.id, 'title description', function (error, review{
if (error) {
// console.error(error);
return res.sendStatus(500);
}
review.title = req.body.title;
review.description = req.body.description;
review.save(function (error) {
if (error) {
console.log(error)
}
res.send({
success: true
})
})
})
并通过更新测试:
it('should throw exception for incorrect id', function (done) {
let updateReview = {
title: 'Updated Title',
description: 'Updated Description'
};
chai.request(app)
.get('/reviews')
.end(function (err, res) {
chai.request(app)
.put('/reviews/12')
.send(updateReview)
.end(function (err, res) {
expect(res).to.have.status(500);
done();
});
});
});
如果要测试是否为给定函数引发了特定错误,则应使用函数作为参数来调用Expect。例如,这可以通过隔离函数中的数据库调用来完成。
答案 1 :(得分:0)
.throw
断言仅适用于函数。更具体地说:应该将其传递给函数引用,并且当Chai调用该函数时,它希望该函数引发错误。
在您的情况下,app
不是函数,它是对Express应用程序的引用(它可以被调用,但您不是在测试应用程序功能,重新测试该应用如何处理特定请求。
在Express应用内抛出错误会触发Express's error handler。它将通过发送HTTP 500响应来处理错误。
您可以对此进行测试:
expect(res).to.have.status(500);