如何在Node JS中引发错误并捕获其摩卡

时间:2018-11-04 12:31:25

标签: javascript node.js express mocha chai

我无法捕获到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();
                });
        });
});

错误: 控制台出错。

未捕获的错误:某些错误

2 个答案:

答案 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);