Тестирование события onClick компонента React с несколькими действиями в нем

Не могу понять, как проверить функцию onClick с несколькими действиями в ней.

onButtonClick = function(action){
  this.props.otherAction();
  action();
}
...
<Button bsStyle="success" bsSize="small" onClick={onButtonClick.bind(this,someAction}>
  Something
</Button>

И тест, который у меня сейчас есть, таков.

const onButtonClick = function (action) {
  actions.otherAction();
  action();
};

it('Should include a button with multiple actions on onClick event.', function () {
    const button = shallowTestUtils.findAllWithType(_component, Button);
    expect(button[0].props.onClick).to.equal(onButtonClick.bind(this, actions.someAction));
});

Результат, который я получаю, таков.

AssertionError: expected [Function] to equal [Function]

1 ответ

Дело в том, что каждый вызов Function.prototype.bind возвращает вам новую функцию. Так что эти функции не равны

function onClick() {
}

console.log(onClick.bind() === onClick.bind()) // prints false

Если вы хотите проверить, что кнопка получает ваш обработчик кликов, вы можете запустить симулированный клик и проверить результат действия. Кроме того, вы можете издеваться onClick шпионить функции.

it('should trigger handler on button click', function () {
  // mock actual action
  _component.onClick = sinon.spy();

  // find button and trigger click on it
  const button = shallowTestUtils.findAllWithType(_component, Button)[0];
  ReactTestUtils.Simulate.click(findDOMNode(button));
  expect(_component.onClick.called).to.be.ok();
});

UPD. Если вы хотите проверить свой компонент в хранилище, чтобы убедиться, что были отправлены правильные действия, вы можете сделать это следующим образом.

Сначала создайте макет магазина:

const mockStore = {
   dispatch: sinon.spy(),
   getState() {
     // here you can return some mock state
   }
}

Затем передайте этот магазин вашему компоненту. (Я предполагаю, что ваш MyComponent подключен к магазину)

const component = TestUtils.createRenderer().render(<MyComponent store={mockStore}>)

const button = shallowTestUtils.findAllWithType(component, Button)[0];
ReactTestUtils.Simulate.click(findDOMNode(button));
// here you can check that dispatch was called with all expected actions
expect(mockStore.dispatch.calledWith({type: 'ACTION_TYPE'})).to.be.ok();

См. Документацию Sinon, чтобы узнать больше о шпионских проверках.

Другие вопросы по тегам