即使间谍被召唤,间谍也会失败

时间:2017-05-21 04:11:54

标签: reactjs jestjs enzyme

在我的组件中,我有......

onSubmit = (e) => {
  e.preventDefault();
  const { history, versionStore } = this.props;
  versionStore.add(this.state.formData)
    .then(() => history.push('/'));
}

在我的考试中......

it('after successfully submit should redirect to / page', () => {
  const spy = jest.spyOn(minProps.history, 'push')
    .mockImplementation((path) => {
      console.log('called with ', path); // IS CALLED!
    });

  const wrapper = shallow(<Add.wrappedComponent {...minProps} />);

  fetchMock.postOnce('/api/version', { name: 'v1' });
  wrapper.setState({ formData: { name: 'v1' } });

  wrapper.find('form').simulate('submit', { preventDefault: jest.fn() });

  expect(spy).toHaveBeenCalledWith('/');

  spy.mockReset();
  spy.mockRestore();
});

测试失败,

  用/ /调用

  expect(jest.fn())。toHaveBeenCalledWith(expected)

     

通过以下方式调用预期的模拟函数:[&#34; /&#34;]
  但它没有被召集。

1 个答案:

答案 0 :(得分:0)

您的重定向是在异步代码中,并且您正在以同步方式对其进行测试,这意味着当测试执行时,承诺尚未解决。我会用两种方法之一解决这个问题

1 - 测试您的提交函数没有事件,然后您可以在承诺链成功后返回承诺并测试重定向

2 - 模拟versionStore.add是同步的,然后执行它的函数。