Причина в том, что при мелкой визуализации компонента Form
оригинальный метод onHandleSubmit
уже привязан к onClick
. Так что даже если вы назначите onHandleSubmitMock
экземпляру компонента Form
. Уже поздно". Когда вы имитируете событие click, оно вызовет оригинальный метод onHandleSubmit
, а не смоделированный.
Если вы настаиваете на замене метода onHandleSubmit
на смоделированный. Необходимо убедиться, что вы заменили метод перед поверхностным рендерингом (привязка к onClick
)
Например form.jsx
:
import React from 'react';
import { shallow } from 'enzyme';
import Form from './form';
test('Submit handler called on click', () => {
const onHandleSubmitMock = jest.fn(() => console.log('mock was called'));
Form.prototype.onHandleSubmit = onHandleSubmitMock;
const wrapper = shallow(<Form />);
const submitButton = wrapper.find(`[data-test="submit"]`);
submitButton.simulate('click');
expect(onHandleSubmitMock).toHaveBeenCalled();
});
form.test.jsx
:
import React, { Component } from 'react';
export class Form extends Component {
constructor() {
this.onHandleSubmit = this.onHandleSubmit.bind(this);
}
onHandleSubmit() {
console.log('this is from the component');
}
render() {
return (
<div>
<button data-test="submit" onClick={this.onHandleSubmit}>
Submit
</button>
</div>
);
}
}
export default Form;
Результаты модульных испытаний с отчетом о покрытии:
PASS stackoverflow/60138901/form.test.jsx (6.937s)
✓ Submit handler called on click (44ms)
console.log stackoverflow/60138901/form.test.jsx:6
mock was called
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 91.67 | 100 | 75 | 90 |
form.jsx | 91.67 | 100 | 75 | 90 | 8
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 8.65s