Я работаю с некоторым кодом, где мне нужно проверить тип исключения, созданного функцией (это TypeError, ReferenceError и т. Д.).
Моя текущая среда тестирования - это AVA, и я могу протестировать ее как t.throws
метод второго аргумента , например, здесь:
it('should throw Error with message \'UNKNOWN ERROR\' when no params were passed', (t) => {
const error = t.throws(() => {
throwError();
}, TypeError);
t.is(error.message, 'UNKNOWN ERROR');
});
Я начал переписывать свои тесты на Jest и не мог найти, как это легко сделать. Это вообще возможно?
источник
expect('here').not.toBe('here');
просто для удовольствия :-)expect('to be').not.toBe('to be')
в стиле Шекспира.Я использую более лаконичный вариант:
источник
Из моего (хотя и ограниченного) знакомства с Jest я обнаружил, что
expect().toThrow()
это подходит, если вы хотите ТОЛЬКО проверить, выдается ли ошибка определенного типа:expect(() => functionUnderTest()).toThrow(TypeError);
ИЛИ выдается ошибка с конкретным сообщением:
expect(() => functionUnderTest()).toThrow('Something bad happened!');
Если вы попытаетесь сделать оба, вы получите ложное срабатывание. Например, если ваш код выдает ошибку
RangeError('Something bad happened!')
, этот тест пройдет:expect(() => functionUnderTest()).toThrow(new TypeError('Something bad happened!'));
Ответ bodolsog, предлагающий использовать try / catch, близок, но вместо того, чтобы ожидать, что истина будет ложной, чтобы гарантировать, что ожидаемые утверждения в catch будут выполнены, вы можете вместо этого использовать
expect.assertions(2)
в начале вашего теста, где2
- количество ожидаемых утверждений , Мне кажется, это более точно описывает цель теста.Полный пример проверки типа И сообщения об ошибке:
Если
functionUnderTest()
НЕ выдает ошибку, утверждения будут выполнены, ноexpect.assertions(2)
не будут выполнены и тест не пройден.источник
expect.hasAssertions()
может быть лучшей альтернативой, когда тест не имеет никаких утверждений снаружиcatch
, потому что вам не нужно обновлять число, если вы добавляете / удаляете утверждения.Сам не пробовал, но я бы предложил использовать утверждение Jest toThrow . Думаю, ваш пример будет выглядеть примерно так:
Опять же, не тестировал, но я думаю, что он должен работать.
источник
У шутки есть метод
toThrow(error)
для проверки того, что функция выдает при ее вызове.Итак, в вашем случае вы должны назвать это так:
Документы
источник
jest.spyOn(service, 'create').mockImplementation(() => { throw new Error(); });
если Передразнивало методcreate
не являетсяasync
.Современные шутки позволяют проводить больше проверок отклоненных значений. Например:
выйдет из строя с ошибкой
источник
В документации ясно, как это сделать. Допустим, у меня есть функция, которая принимает два параметра, и она выдаст ошибку, если один из них
null
.Ваш тест
источник
Если вы работаете с
Promise
s:источник
В итоге я написал удобный метод для нашей библиотеки test-utils
источник
В дополнение к сообщению Питера Дэниса просто хотел подчеркнуть часть его решения, включающую «[передачу] функции в expect (function) .toThrow (blank или type of error)».
В Jest, когда вы проверяете случай, когда должна быть выдана ошибка, внутри вашей оболочки expect () тестируемой функции вам необходимо предоставить один дополнительный слой оболочки функции стрелки, чтобы она работала. Т.е.
Неправильный (но логичный подход большинства людей):
Правильно:
Это очень странно, но тестирование должно пройти успешно.
источник
пытаться
expect(t).rejects.toThrow()
источник
try
? там не пробовать - но ответь. Если это ответ, то просьба уточнить подробности. что вы добавляете к существующему ответу?