#reactjs #function #jestjs #mocking #react-testing-library
Вопрос:
Я пытаюсь проверить, вызывается ли функция
import React from 'react';
import { render, cleanup, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import MyForm from './MyForm';
afterEach(cleanup);
const testFunction = jest.fn();
test('my form', () => {
const { getByTestId } = render(<MyForm />);
const myButton = getByTestId('submit-button');
expect(myButton.tagName).toBe('BUTTON');
fireEvent.click(myButton)
expect(testFunction).toHaveBeenCalledTimes(1)
});
Проблема, с которой я сталкиваюсь, заключается в том, что она, похоже, не привязана к фиктивной функции, но она вызывает функцию в компоненте.
import React from 'react';
export default function myForm() {
function testFunction() {
console.log('hello from inside');
}
return (
<div>
<form onSubmit={testFunction}>
<input type="text" />
<button type="submit" data-testid="submit-button">submit</button>
</form>
</div>
);
}
Как мне вызвать фиктивную функцию, а не «реальную» функцию.
expect(jest.fn()).toHaveBeenCalledTimes(1)
Expected mock function to have been called one time, but it was called zero times.
Комментарии:
1. Должен ли вы
testFunction
быть (скрыт) внутри компонента myForm? Если бы это была подставка, вы могли бы пройти ее в своем тесте, а затем была бы вызвана функция mock.2. Я видел, как это делалось — почти в каждом примере. Я бы изменил свой код, чтобы он соответствовал тесту. Я мог бы, но мне это кажется неправильным.
Ответ №1:
Вы не можете вызывать внутренние функции myForm
. Вы можете протестировать поведение и конечный ощутимый результат, но не личную функциональность компонента.
И это тоже имеет смысл. Модульный тест должен касаться результата, а не того, вызывается ли конкретная функция, внутренняя для этого компонента.
Да, вы всегда можете проверить поведение. Например, вы можете проверить, что console.log
называется тем, что видно внешнему миру с точки зрения осязаемой вещи.
Аналогично, если testFuntion
вы делаете что-то еще, что вы можете утверждать, вы также можете это проверить.
Другой вариант — testFunction
вытащить и экспортировать его, чтобы его можно было использовать где угодно. Затем вы пишете модульный тест только testFunction
для функциональности, которая может быть, но не в контексте модульного теста компонентов