开玩笑-承诺在模拟中解决了多少时间之后?

时间:2019-02-21 14:18:22

标签: reactjs jestjs react-testing-library

我有一个开玩笑的测试,我正在模拟axios的实现。

在渲染组件时,它会发出一个api调用。

在拨打电话时,我需要测试微调框是否出现。 我需要测试通话结束后微调框是否消失。

我怎么知道模拟承诺何时解决?

axios.get.mockImplementationOnce(() => Promise.resolve({
data:{ query_scores: someData },
}));

const { queryByTestId, getByText } = renderWithRouter(
    <MyComponent />,
  );

  expect(queryByTestId('spinner')).not.toBeNull();

我如何确定在调用not.toBeNull时尚未兑现承诺?

注意:我正在使用反应测试库,但问题通常与模拟承诺解决的时间有关。

1 个答案:

答案 0 :(得分:1)

根据https://jestjs.io/docs/en/asynchronous,返回承诺的时间并没有太多的延迟,但是您需要从测试中返回一个Promise,而Jest会等待该Promise返回(但是很长时间)就是这样。

test('the data is peanut butter', () => {
  return fetchData().then(data => {
  expect(data).toBe('peanut butter');
  });
});

根据您的情况,根据jest.io(https://jestjs.io/docs/en/mock-functions.html),您将使用以下方法返回值:

axios.get.mockResolvedValue(resp);

然后进行测试

return Users.all().then(resp => expect(resp.data).toEqual(users));

如果您想在Promise中添加时间延迟,可以使用setTimeout来控制返回时间

const getData = async () => {
  return new Promise(resolve => {
     setTimeout(resolve, 1000);  //added arbitrary delay
   });
 };

然后,如果您使用await调用getData函数,则可以测试前后响应,以查看微调框是否按预期显示和消失

expect(queryByTestId('spinner')).not.toBeNull(); //expect spinner on render
await getData();
expect(queryByTestId('spinner')).toBeNull();  //expect no spinner on data returned