Я пытаюсь написать тест для Jasmine Test Framework, который ожидает ошибку. В данный момент я использую интеграцию Jasmine Node.js из GitHub .
В моем модуле Node у меня есть следующий код:
throw new Error("Parsing is not possible");
Теперь я пытаюсь написать тест, который ожидает эту ошибку:
describe('my suite...', function() {
[..]
it('should not parse foo', function() {
[..]
expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));
});
});
Я попробовал также Error()
и некоторые другие варианты и просто не могу понять, как заставить это работать.
javascript
testing
node.js
jasmine
echox
источник
источник
Function.bind
: stackoverflow.com/a/13233194/294855Ответы:
Вы должны передавать функцию в
expect(...)
вызов. Код у вас здесь:пытается на самом деле вызвать
parser.parse(raw)
в попытке передать результат вexpect(...)
,Попробуйте вместо этого использовать анонимную функцию:
источник
expect(parser.parse).toThrow(...)
expect(blah).toThrow()
. Отсутствие аргументов означает проверку, чтобы увидеть, что он бросает вообще. Соответствие строк не требуется. См. Также: stackoverflow.com/a/9525172/1804678parser.parse
используетсяthis
, передача его без контекста приведет к неожиданным результатам. Вы могли бы пройтиparser.parse.bind(parser)
, но, честно говоря ... анонимная функция была бы более элегантной.Ты используешь:
Но если вы посмотрите на комментарий функции (ожидается строка):
Я полагаю, вы должны написать это так (используя лямбда-анонимную функцию):
Это подтверждается в следующем примере:
Дуглас Крокфорд настоятельно рекомендует этот подход вместо использования «throw new Error ()» (способ создания прототипа):
источник
Error
( jsfiddle.net/k1mxey8j ). Однако у вашего брошенного объекта, разумеется, не будет.stack
свойства, которое может быть важно, если вы хотите настроить автоматическое создание отчетов об ошибках.Более элегантное решение, чем создание анонимной функции, единственной целью которой является обтекание другой, является использование
bind
функции es5 . Функция связывания создает новую функцию, для которой при вызове ееthis
ключевое слово устанавливается на предоставленное значение с заданной последовательностью аргументов, предшествующей любому предоставленному при вызове новой функции.Вместо:
expect(function () { parser.parse(raw, config); } ).toThrow("Parsing is not possible");
Рассматривать:
expect(parser.parse.bind(parser, raw, config)).toThrow("Parsing is not possible");
Синтаксис bind позволяет вам тестировать функции с разными
this
значениями, и, на мой взгляд, делает тест более читабельным. Смотрите также: https://stackoverflow.com/a/13233194/1248889источник
Я заменяю сопоставление toThrow от Jasmine следующим: оно позволяет сопоставить свойство name исключения или его свойство message. Для меня это облегчает написание тестов и делает их менее хрупкими, поскольку я могу делать следующее:
и затем проверьте следующее:
Это позволяет мне настроить сообщение об исключении позже, не нарушая тесты, когда важно то, что оно выдало ожидаемый тип исключения.
Это замена toThrow, которая позволяет это:
источник
expect(blah).toThrow()
. Отсутствие аргументов означает проверку, чтобы увидеть, что он бросает на всех. Соответствие строк не требуется. См. Также: stackoverflow.com/a/9525172/1804678Как упоминалось ранее, необходимо передать функцию, так
toThrow
как это функция, которую вы описываете в своем тесте: «Я ожидаю, что эта функция выдает x»При использовании Jasmine-Matchers, вы также можете использовать один из следующих вариантов, когда они соответствуют ситуации;
или
источник
expect(foo).toThrowError(TypeError);
в Жасмин 2.5: jasmine.github.io/2.5/introductionЯ знаю, что это больше кода, но вы также можете сделать:
источник
Для любителей кофе
источник
Для тех, кто все еще может столкнуться с этой проблемой, для меня опубликованное решение не сработало, и оно продолжало выдавать эту ошибку:
Error: Expected function to throw an exception.
позже я понял, что функция, которую я ожидал выдать ошибку, была асинхронной функцией и ожидала обещания быть отклоненным и затем выдать ошибку, и это то, что я делал в своем коде:и вот что я сделал в моем тесте, и это сработало:
источник
expectAsync
jasmine.github.io/api/3.3/async-matchers.html