bind
создает новую функцию при каждом ее вызове, поэтому каждый раз, когда ваш компонент выполняет рендеринг, он создает новую функцию и связывает ее с onClick
.
. Из-за этогоневозможно шпионить за onClick
функцией напрямую ...
... но новая функция привязывается к функции в прототипе класса вашего компонента, поэтому, если вы оберните функцию-прототипсо шпионом до рендеринга вашего компонента, функция onClick
будет привязана к вашему шпиону.
Вот упрощенный пример:
code.js
import * as React from 'react';
export class TableComponent extends React.Component {
edit(c) { }
render() {
const { c } = this.props;
return (
<table>
<tbody>
<tr id='clicktest' onClick={this.edit.bind(this, c)} key={c.id}>
<td>{c.name}</td>
</tr>
</tbody>
</table>
);
}
}
code.test.js
import * as React from 'react';
import { mount } from 'enzyme';
import { TableComponent } from './code';
let wrapper, editSpy;
beforeEach(() => {
editSpy = jest.spyOn(TableComponent.prototype, 'edit');
wrapper = mount(<TableComponent c={{ id: 1, name: 'one' }} />)
});
afterEach(() => {
editSpy.mockRestore();
})
it('should call getContext method on button click', () => {
wrapper.find('#clicktest').simulate('click');
expect(editSpy).toHaveBeenCalled(); // Success!
});