Тестирование на ошибки, брошенные в мокко [дубликат]


этот вопрос уже есть ответ здесь:

Я надеялся найти некоторую помощь с этой проблемой. Я пытаюсь написать тесты для приложения, которое я пишу. Я перегнал проблему в следующий пример кода. Я хочу проверить, что ошибка была брошена. Я использую Testacular в качестве тестового бегуна с mocha в качестве фреймворка и 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");
        });
    });
});
3 58

3 ответа:

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

The

добавлять к лучшие ответы, если вам нужно вызвать свою функцию как часть теста (т. е. ваша функция должна выдавать ошибку только при передаче определенных параметров), вы можете обернуть вызов функции в анонимную функцию или, в 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");

Я видел, что вы смогли решить свою проблему, но не смогли проверить наличие конкретной ошибки. Для этого с помощью синтаксиса Chai expect/should вы можете использовать параметры из разных сигнатур 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/);

надеюсь, что это помогает!