Как сгенерировать ошибку в узле js и поймать ее мокко - PullRequest
0 голосов
/ 04 ноября 2018

Я не могу поймать ошибку, которую я выкидываю в Node и ловлю в мокко. Пожалуйста, помогите!

Node: Код узла, который выдает ошибку

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();
                });
        });
});

Ошибка: Ошибка с консоли.

Uncaught Error: некоторая ошибка

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Вы не можете ожидать появления ошибки в конце вашего 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();
                    });
            });
    });

Если вы хотите проверить, что для данной функции выдается конкретная ошибка, вам следует вызвать функцию wait в качестве параметра. Это можно сделать, например, изолировав вызов базы данных в функции.

0 голосов
/ 04 ноября 2018

Утверждение .throw работает только для функций. Более конкретно: ему должна быть передана ссылка на функцию, и когда Чай вызывает эту функцию, он ожидает, что функция выдает ошибку.

В вашей ситуации app - это не функция, это ссылка на приложение Express (оно может вызываться, но вы не тестируете функцию приложения, вы тестируете, как приложение обрабатывает определенный запрос).

Выдает ошибку внутри приложения Express запускает Обработчик ошибок Express . Он обработает ошибку, отправив ответ HTTP 500.

Вы можете проверить это:

expect(res).to.have.status(500);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...