如何在节点 js 中抛出错误并捕获它 mocha
How to throw error in node js and catch it mocha
我无法捕获我在 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();
});
});
});
错误:
来自控制台的错误。
未捕获的错误:一些错误
.throw
断言仅适用于函数。更具体地说:它应该传递一个函数引用,当 Chai 调用该函数时,它预计该函数会抛出错误。
在你的情况下,app
不是函数,它是对 Express 应用程序的引用(它 可能 是可调用的,但你没有测试应用程序功能,您正在测试应用程序如何处理特定请求)。
在 Express 应用程序中 引发错误 会触发 Express's error handler。它将通过发送 HTTP 500 响应来处理错误。
你可以测试这个:
expect(res).to.have.status(500);
您不能期望在 http 调用结束时抛出错误。
您可以通过添加响应而不是抛出行来测试特定请求的 return 代码,如下所示:
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 并将该函数作为参数。例如,这可以通过在函数中隔离数据库调用来完成。
我无法捕获我在 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();
});
});
});
错误: 来自控制台的错误。
未捕获的错误:一些错误
.throw
断言仅适用于函数。更具体地说:它应该传递一个函数引用,当 Chai 调用该函数时,它预计该函数会抛出错误。
在你的情况下,app
不是函数,它是对 Express 应用程序的引用(它 可能 是可调用的,但你没有测试应用程序功能,您正在测试应用程序如何处理特定请求)。
在 Express 应用程序中 引发错误 会触发 Express's error handler。它将通过发送 HTTP 500 响应来处理错误。
你可以测试这个:
expect(res).to.have.status(500);
您不能期望在 http 调用结束时抛出错误。
您可以通过添加响应而不是抛出行来测试特定请求的 return 代码,如下所示:
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 并将该函数作为参数。例如,这可以通过在函数中隔离数据库调用来完成。