Похоже, вы передаете свой обработчик в контейнер, а не в компонент.Всякий раз, когда вы имитируете щелчок, этот метод сопоставляется с реквизитом вашего компонента, который вызывается.
Итак, у вас есть две возможности.
1) Redux помогает вам отделить презентацию от поведения, чтобы вы могли извлечь ваш презентационный компонент и протестировать его отдельно.Ваш тест, вероятно, будет выглядеть примерно так:
it('adds calculation steps', () => {
const mockAdd = jest.fn();
const value = 1;
const element = mount(<Pad value={value} add={mockAdd}/>);
const clickable = element.find('.pad');
clickable.simulate('click');
expect(mockAdd).toHaveBeenCalledWith(value);
});
Ваш компонент будет выглядеть так:
export class Pad extends React.Component {
handleClick = () => {
this.props.add(this.props.value);
};
render() {
return (
<div className="pad" onClick={this.handleClick}>
{this.props.display}
</div>
);
}
}
2) Если вы действительно хотите протестировать компонент интеграции и контейнер, то вы можетеиспользуйте что-то вроде redux-mock-store .Это позволит вам проверить действие, выполненное через диспетчера.Ваш тест, вероятно, будет выглядеть примерно так:
it('adds calculation steps', () => {
const mockStore = configureStore([])
const store = mockStore({})
const value = 1;
const element = mount(
<Provider store={store}>
<Pad value={value}/>
</Provider>
);
const clickable = element.find('.pad');
clickable.simulate('click');
expect(store.getActions()).toHaveBeenCalledWith([
calculatorActionCreators.addExpression(val),
]);
});
Также метод mapStateToProps
из redux получает 2-й аргумент, который является собственным портом контейнера.Затем я бы объяснил, что значение передается через.
например, const mapStateToProps = (state, ownProps) => ({ value: ownProps.value});
Надеюсь, это поможет!