在模拟通话中等待所有承诺

时间:2017-04-02 04:26:39

标签: javascript reactjs jestjs enzyme

我正在使用Jest和Enzyme来测试React组件。

My React组件(正在测试中)有一个远程选择组件。当用户键入一些文本时,将从API获取数据并显示选项。

sorted_list = sorted(dict.keys(), key=lambda k: dict[k][2], reverse=True)[:3]
for key in sorted_list:
    print 'key is '+ key + ' value is '+ sorted_list[key][3] 

当用户键入一些文本时,第一个测试从商店中获取数据。第二个测试选择一个选项。第二次测试失败了。

很难解释这是一个SO问题。选项在Promise的“then”部分设置。 “然后”功能在第二次模拟之前没有执行。因此,当第二个模拟被触发时,不会设置选项。

如果我在setTimeout()中移动第二个测试,则第二个测试通过。

Jest是否还要确保在执行更多测试之前执行承诺的“当时”?

1 个答案:

答案 0 :(得分:1)

你可以这样做:

test('should fetch data', () => {
  // mock the API call
  const store = require('../../src/store').default;
  let promise;
  store.fetchData = jest.fn(() => {
    promise = Promise.resolve([{ 
      id: 1, 
      name: 'someText', 
    }]);
    return promise;
  );

  // test
  const wrapper = shallow(<Form />);
  const remote = wrapper.find('RemoteSelect').first();
  remote.simulate('fetch', 'someText');
  expect(store.fetchData).toBeCalled();

  return promise.then((result) => {
    // more test
    remote.simulate('change', 1);
    const remoteRequeried = wrapper.find('RemoteSelect').first();
    expect(remoteRequeried.prop('label')).toBe('someText');
  });
});