Подтвердить что ты не робот

Тестирование ошибок, вызванных мокко

Я надеюсь найти какую-то помощь в решении этой проблемы. Я пытаюсь написать тесты для приложения, которое я пишу. Я поставил проблему в следующем примере кода. Я хочу проверить, что ошибка была брошена. Я использую Testacular в качестве тестового бегуна с моккой в ​​качестве основы и chai в качестве библиотеки утверждений. Тесты выполняются, но тест терпит неудачу, потому что была выброшена ошибка! Любая помощь очень ценится!

function iThrowError() {
    throw new Error("Error thrown");
}

var assert = chai.assert,
    expect = chai.expect;
describe('The app', function() {
    describe('this feature', function() {
        it("is a function", function(){
            assert.throw(iThrowError(), Error, "Error thrown");
        });
    });
});
4b9b3361

Ответ 1

Вы не передадите свою функцию на assert.throws() правильным способом.

Функция assert.throws() ожидает, что функция станет ее первым параметром. В вашем коде вы вызываете iThrowError и передаете его возвращаемое значение при вызове assert.throws().

В основном, изменяя это:

assert.throws(iThrowError(), Error, "Error thrown");

:

assert.throws(iThrowError, Error, "Error thrown");

должен решить вашу проблему.

Ответ 2

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

@param{ ErrorConstructor } constructor
@param{ String | RegExp } expectederror message
@param{ String } message _optional_

В вашем примере вы можете использовать одно из следующих действий:

expect(iThrowError).to.throw(/Error thrown/);
expect(iThrowError).to.throw(Error, /Error thrown/);
expect(iThrowError).to.throw(new Error('Error thrown'));

И (опять же, из документации chai), вы можете фильтровать другие сообщения об ошибках, используя:

expect(iThrowError).to.throw(Error).and.not.throw(/Another Error thrown/);

Надеюсь, это поможет!

Ответ 3

Добавляем к верхнему ответу, если вам нужно вызвать вашу функцию как часть теста (т.е. ваша функция должна выдавать ошибку только при передаче определенных параметров), вы можете обернуть свой вызов функции анонимной функцией или, в ES6 +, вы можете передать свою функцию в выражении функции стрелки.

// Function invoked with parameter.
// TEST FAILS. DO NOT USE.
assert.throws(iThrowError(badParam), Error, "Error thrown"); // WRONG!

// Function invoked with parameter; wrapped in anonymous function for test.
// TEST PASSES.
assert.throws(function () { iThrowError(badParam) }, Error, "Error thrown");

// Function invoked with parameter, passed as predicate of ES6 arrow function.
// TEST PASSES.
assert.throws(() => iThrowError(badParam), Error, "Error thrown");

И, только ради тщательности, здесь более буквальная версия:

// Explicit throw statement as parameter. (This isn't even valid JavaScript.)
// TEST SUITE WILL FAIL TO LOAD. DO NOT USE, EVER.
assert.throws(throw new Error("Error thrown"), Error, "Error thrown"); // VERY WRONG!

// Explicit throw statement wrapped in anonymous function.
// TEST PASSES.
assert.throws(function () { throw new Error("Error thrown") }, Error, "Error thrown");

// ES6 function. (You still need the brackets around the throw statement.)
// TEST PASSES.
assert.throws(() => { throw new Error("Error thrown") }, Error, "Error thrown");