Sinon несколько заглушек в одном тесте - PullRequest
0 голосов
/ 10 июня 2019

Я хочу протестировать функцию saveRecords для сбоя , и перед этим мне нужно пройти аутентификацию и подключить MongoDB. Это код.

 before(() => {
    sinon.stub(Authentication, 'authenticate').returns(true);
    sinon.stub(mongodb, 'connect').resolves("connected");
    sinon.stub(models, 'saveRecords').throws(new Error("Error while saving record"));
});

it('Should error out if record is not inserted into the mongodb 
  collection', () => {
    orderWebhook(req, res)
    expect(res.result).to.contain("Error while saving record");
});

Вот код, который я тестирую.

exports.orderWebhook = async (req, res) => {
    try {
        const isAuthenticated = Authentication.authenticate(req);
        if (isAuthenticated) {
        await mongodb.connect();
        await models.saveRecords(req.body");
        res.status(200).send('Saved Successfully!');
        } else {
        res.status(403).send('Error! Auth failed!');
        }
    } catch (error) {
        res.status(400).send(error.message);
    }
}

Я предполагаю, что этот код заглушит аутентификацию, затем подключит MongoDB, а затем попытается вставить запись и выдать ошибку. Но он работает два раза , когда я отлаживаю с помощью отладчика VSCode.

  1. При первом возвращении true для функции authenticate и без разрешения подключения MongoDB и немедленного возврата.
  2. Во второй раз он запускает все три правильно и выдает ожидаемую ошибку.

При запуске теста в терминале происходит сбой . В чем может быть проблема?

Обновление: я заметил, что проблема связана с обещанием. Sinon обрабатывает запрос, и я использую await mongodb.connect (); , но он не работает должным образом, и если я удаляю await и возвращаю значение вместо обещания это работает.

...