Reactjs 戏谑故事

Reactjs 戏谑故事,reactjs,redux,jestjs,redux-saga,react-testing-library,Reactjs,Redux,Jestjs,Redux Saga,React Testing Library,问题 我正在使用redux saga、jest、redux mock store和react测试库,我尝试测试一个saga,它会轮询服务器,直到响应的状态得到解决。 在这个故事中,我使用redux-saga-delay函数来创建轮询间隔 const INTEVAL_TIME = 3000; function* saga(action) { try { yield delay(INTEVAL_TIME); while (true) { const { data

问题

我正在使用redux saga、jest、redux mock store和react测试库,我尝试测试一个saga,它会轮询服务器,直到响应的状态得到解决。 在这个故事中,我使用redux-saga-delay函数来创建轮询间隔

 const INTEVAL_TIME = 3000;

 function* saga(action) {
  try {
    yield delay(INTEVAL_TIME);
    while (true) {
      const { data } = yield call(apiCall);
      if (data.status === 'success') {
        yield put(success());
        break;
      }

      if (data.status === 'failure') {
        yield put(failure());
        break;
      }
      yield delay(INTEVAL_TIME );
    }
  } catch (error) {
    yield put(failure());
  }
}

   
我如何在测试中模拟延迟不等待3秒(可能将延迟设置为0或立即解决)。 例如,这是我的测试

it('some test', async () => {
 const { getByTestId } = render(<MyComponent />);
 userEvent.click(getByTestId('button');

 await waitFor(() => {
      expect(store.getActions()).toEqual(succesPayloadMock);
     });
  });
it('sometest',async()=>{
const{getByTestId}=render();
点击(getByTestId('button');
等待等待(()=>{
expect(store.getActions()).toEqual(succesPayloadMock);
});
});

这个问题的解决方案实际上在redux saga初学者教程中讨论过。简单地说,你想产生一个调用效果,而不是直接调用延迟

这个问题的解决方案实际上在初学者教程中讨论过ng>redux saga。简而言之,您希望产生调用效果,而不是直接调用延迟

我不确定是否完全理解您的问题,但当涉及redux saga时,我使用库并集成延迟模拟,我会执行以下操作:

      const provideDelay = ({ fn }: FnObj, next: () => void) =>
        fn.name === "delayP" ? null : next();

      return expectSaga(function)
        .provide([{ call: provideDelay }])
        .call(anotherFunction)
        .run();

我不确定我是否完全理解您的问题,但当涉及到redux saga时,我使用该库并集成延迟模拟,我执行以下操作:

      const provideDelay = ({ fn }: FnObj, next: () => void) =>
        fn.name === "delayP" ? null : next();

      return expectSaga(function)
        .provide([{ call: provideDelay }])
        .call(anotherFunction)
        .run();