Я использую jest с библиотекой react-testing-library для тестирования компонента, у которого есть настраиваемый валидатор типов свойств. Валидатор выглядит так:
aspectRatio: (props, propName, componentName) => {
const value = props[propName];
const cleaned = value
.trim()
.replace(/[^0-9:]+/g, ''); // Replace everything but numbers and forward slash.
// Ensure value is “number/number”.
const isCorrectFormat = /^\d+:\d+$/.test(cleaned);
if (!isCorrectFormat) {
return new Error(`Invalid value format “${value}” supplied to “${propName}” prop in “${componentName}” component. Expected something like “3:2”.`);
}
},
Мой тест выглядит так:
test('throws error when incorrect aspect ratio format passed', () => {
expect(() => {
render(
<Picture
alt = "Hello, picture."
aspectRatio = "1-1/8"
src = "test/books.jpg"
/>,
);
}).toThrowError();
});
Валидатор работает должным образом при рендеринге неисправного aspectRatio. В консоли появляется следующая ошибка:
Warning: Failed prop type: Invalid value format “1-1/8” supplied to “aspectRatio” prop in “Picture” component. Expected something like “3:2”.
Но при запуске вышеуказанного теста я получаю в терминале такое сообщение:
● throws error when incorrect aspect ratio format passed
expect(received).toThrowError()
Received function did not throw
81 | />,
82 | );
> 83 | }).toThrowError();
| ^
84 | spy.mockRestore();
85 | });
86 |
Что мне не хватает?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку валидатор propType на самом деле не поддерживает throw, я смог решить проблему путем тестирования содержимого console.warn.
test('throws error when incorrect aspect ratio format passed', () => {
console.error = jest.fn();
render(
<Picture
alt = "Hello, picture."
aspectRatio = "1-1/8"
src = "test/books.jpg"
/>,
);
expect(console.error.mock.calls[0][2]).toBe('Invalid value format “1-1/8” supplied to “aspectRatio” prop in “Picture” component. Expected something like “3:2”.');
});
Регистрация ошибки - это не то же самое, что бросание ошибка