如何在节点 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 并将该函数作为参数。例如,这可以通过在函数中隔离数据库调用来完成。