#reactjs #unit-testing #jestjs #mocking
#reactjs #модульное тестирование #jestjs #издевательство
Вопрос:
Для простоты я создал образец приложения в stackblitz.
Компонент Hello использует служебную функцию, которую мне нужно смоделировать, чтобы протестировать ее.
const hmmm = mockMe();
const Hello = () => (
<div>
<h1>Hello StackBlitz!</h1>
<p>{hmmm}</p>
</div>
);
Я попробовал несколько способов издевательства над функцией, например:
import * as utils from '../utils';
describe('Hello component', () => {
it('should mock the utility function', () => {
jest.spyOn(utils , 'mockMe').mockReturnValue("Mocked!");
// render the component and test it
}
}
Моя проблема в том, что Hello.js запускается перед тестовым файлом. Таким образом, он выполняет служебную функцию перед применением макета.
Единственное решение, которое я мог придумать, — это изменить код компонента и переместить вызов утилиты внутри функции рендеринга. Я хотел бы избежать этого изменения.
Есть ли способ имитировать служебную функцию и сохранить код без изменений?
Комментарии:
1. Вы, кажется, ни к
jest.mock
чему. Существуют различные варианты взаимодействия с модулями на объекте Jest: jestjs.io/docs/en/jest-object2. Если я изменю свой код таким образом, чтобы функция вызывалась внутри функции рендеринга, макет работает просто отлично. Вы уверены, что я должен использовать jest.mock? Несмотря на это, его добавление не повлияло на мой тест, и макет по-прежнему не работает.
3. Всем, кто голосует за закрытие, поскольку «нуждается в большем внимании» (или по любой другой причине в этом отношении) — пожалуйста, оставьте комментарий о том, чего вам не хватает, чтобы я мог улучшить вопрос. Спасибо!
Ответ №1:
Перед использованием методов из utils
вам нужно смоделировать utils
папку. Например, jest.mock('../utils');
Комментарии:
1. Вероятно, вы пропустили эту строку:
jest.spyOn(utils , 'mockMe').mockReturnValue("Mocked!");