Тестирование на ошибки, брошенные в мокко [дубликат]
этот вопрос уже есть ответ здесь:
Я надеялся найти некоторую помощь с этой проблемой. Я пытаюсь написать тесты для приложения, которое я пишу. Я перегнал проблему в следующий пример кода. Я хочу проверить, что ошибка была брошена. Я использую 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 ответа:
добавлять к лучшие ответы, если вам нужно вызвать свою функцию как часть теста (т. е. ваша функция должна выдавать ошибку только при передаче определенных параметров), вы можете обернуть вызов функции в анонимную функцию или, в 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/);
надеюсь, что это помогает!