【问题标题】:setTimeout in Jest/Enzyme TestsJest/Enzyme 测试中的 setTimeout
【发布时间】:2023-03-06 11:08:01
【问题描述】:

这是我的代码块:

   it("saving flow (entering into edit mode and saving) works correctly", (done) => {

const wrapper = mount(
  <Root>
    <DictionaryRooms/>
  </Root>
);

moxios.wait(() => {
  wrapper.update();


  wrapper.find('.btn-dark').at(1).simulate('click');

  setTimeout(() => {
    expect(wrapper.find('.editField span').at(0).text().trim()).toEqual(jsonDataRooms.data[0].name);
  }, 1000);

  done();
  wrapper.unmount();
})

  });

如您所见,我正在尝试模拟单击按钮,这在我的应用程序中会导致从后端服务器下载一些新数据。这些数据将在我的后端数据进入后立即可见,然后将其显示。因此,在我的请求完成后,我再次尝试检查新数据是否是我所期望的。 显然,点击后需要时间下载,过一会就会显示出来。这就是为什么我需要像 setTimeout 这样的东西。但这行不通。不知道为什么...

感谢您的任何建议。

【问题讨论】:

  • 你尝试过类似 jest.useFakeTimers(); jestjs.io/docs/en/timer-mocks.html ?
  • 我正在阅读有关此的文档,但仍无法将其应用于我的代码
  • 在我的应用程序中导致从后端服务器下载一些新数据 - 它不应该。应该在单元测试中模拟请求。

标签: reactjs jestjs enzyme


【解决方案1】:

setTimeout() 的调用将使回调排队,但测试会继续同步执行,并在回调有机会执行之前调用done()wrapper.unmount()

setTimeout() 回调中调用那些:

setTimeout(() => {
  expect(wrapper.find('.editField span').at(0).text().trim()).toEqual(jsonDataRooms.data[0].name);
  wrapper.unmount();
  done();
}, 1000);

测试可能存在其他问题(未提供正在测试的代码),但进行更改将使您更接近。您也可能不需要等待一秒钟,使用 0 超时可能就足够了(可能有一个排队回调,只需要在 expect 之前执行)。

【讨论】:

    猜你喜欢
    • 2018-09-14
    • 2018-12-16
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2017-02-12
    • 2021-01-08
    • 2020-08-07
    相关资源
    最近更新 更多