Чай ожидал, что [Функция] выдаст (ошибку), не пройдя тест (с использованием узла)

Вопрос:

Я использую Chai для проведения тестов, и мне кажется, что я застрял на тестировании ожидаемой ошибки:

Чай ожидал, что [Функция] выдаст (ошибку)

Текущий код:

Вот код теста:

describe('Do something', function () {

    it('should remove a record from the table', function (done) {

        storage.delete(ID, done);

    });

    it('should throw an error when the lookup fails', function () {

         expect(storage.delete.bind(storage, ID)).to.throw('Record not found');
    });
});

Вот код функции:

delete: function (id, callback) {
    //  Generate a Visitor object
    visitor = new Visitor(id);

    /*  Delete the visitor that matches the queue an
        cookie provided. */
    tableService.deleteEntity(function (error, response) {

        //  If successful, go on.
        if (!error) {
            // Do something on success.
        }
        //  If unsuccessful, log error.
        else {
            if (error.code === 'ResourceNotFound') {
                throw new Error('Record not found');
            }

            //  For unexpected errros.
            else {

                throw new Error('Table service error (delete): ' + error);

            }
        }
        if (callback) callback();
    });

},

Попытки решения:

Я пробовал несколько вариантов вызова функции ожидания (включая вызов анонимной функции:

expect(function() {storage.delete(ID);}).to.throw('Record not found');

Свяжите, как показано в примере,

и основной из

expect(storage.delete(ID)).to.throw('Record not found');

Я также попытался заменить параметр throw из 'Record not found' на несколько вещей, включая направление ввода на уже созданную ошибку (Error) и создание новой ошибки в параметре (new Error ('Record not found')) ;

Возможные причины:

У меня есть подозрение, что ошибка не возникает, потому что тесту требуется некоторое время, чтобы связаться с базой данных для удаления записи, однако я не уверен, как я могу это исправить.

Вдобавок кажется, что тест, который запускается сразу после этого, на самом деле возвращает ошибку, которая должна была быть возвращена в ЭТОМ тесте.


person Grandas    schedule 09.03.2015    source источник
comment
tableService.deleteEntity синхронно?   -  person zerkms    schedule 09.03.2015
comment
Тогда tableService.deleteEntity никогда не вызывает исключения. Это вложенный обработчик, который работает асинхронно.   -  person zerkms    schedule 09.03.2015
comment
Спасибо! В таком случае, возможно, вы могли бы порекомендовать метод проверки этого выброса ошибки? Или способ переписать функцию, чтобы можно было тестировать?   -  person Grandas    schedule 09.03.2015
comment
Вместо этого верните обещания.   -  person zerkms    schedule 09.03.2015
comment
Какое обещание в этом контексте?   -  person Grandas    schedule 09.03.2015
comment
developer.mozilla.org/en/docs/Web/JavaScript/ Ссылка / и любая реализация, например Q или Bluebird   -  person zerkms    schedule 09.03.2015
comment
Изучите chai-as-promises и этот вопрос SO   -  person Kirill Slatin    schedule 09.03.2015
comment
Большое спасибо за ответы, ребята! Борьба с обещаниями сейчас, никогда раньше ими не пользовалась.   -  person Grandas    schedule 09.03.2015


Ответы (1)


Учитывая (из комментариев), что tableService.deleteEntity является асинхронным, проверить это throw невозможно. Да и сам код недействителен. Поскольку выброшенное исключение не будет перехвачено, оно не будет обработано, поскольку оно было выбрано в другом тике. Подробнее об асинхронной обработке ошибок в JavaScript и необработанные исключения в Node.js

Другими словами, такую ​​функцию нельзя протестировать на предмет ошибок:

function behaveBad(){
    setTimeout(function(){
        throw new Error('Bad. Don\'t do this');
    }, 50);
}
person Kirill Slatin    schedule 09.03.2015
comment
Понятно. Сейчас я попробую Promises и Chai as Promises, спасибо за ответ! - person Grandas; 09.03.2015