Jest spyOn for redux saga 'call' 给出错误

Jest spyOn for redux saga 'call' gives error

所以我尝试使用开玩笑从 redux-saga/effects 模拟 call 函数,它似乎抛出了一个错误 call is not declared configurable.

import * as mockreduxSagaEffects from 'redux-saga/effects';

test('calls all the appropriate actions', async () => {
    const dispatchedActions = [];


    jest.spyOn(mockreduxSagaEffects, 'call', 'get').mockImplementationOnce(() => someData);

  });

我做错了什么?

用常规方法测试 redux-saga 是一件非常麻烦的事情。你应该用redux-saga-test-plan我强烈推荐它,非常好

所以,我没有看到您想测试的传奇,但看到您想要模拟 .call() 让我们以它为例。我想如果你理解了这一点,你理解 redux-saga 的其他特性就不会有问题了。

function* userSaga(api) {
  const user = yield call(api.fetchUser, action.payload);

  yield put({
    type: 'RECEIVE_USER',
    payload: { user, pet },
  });
}

it('fetches the user', () => {
  const fakeUser = { name: 'Jeremy', petId: 20 };
  const fakeDog = { name: 'Tucker' };

  return expectSaga(userSaga, api)
    .provide([
      [call(api.fetchUser, 42), fakeUser],
    ])
    .put({
      type: 'RECEIVE_USER',
      payload: { user: fakeUser, pet: fakeDog },
    })
    .run();
});

注意我们如何传递一个包含我们想要模拟的调用和我们想要模拟的结果的数组。您也可以使用 select 来做到这一点。 Put 也非常直观,您的测试将期望 saga 触发此操作。

还有其他东西,真的很有用,比如

.withReducer(reducer)
.hasFinalState({
   name: 'Tucker',
   age: 12,
 })

通过这种方式,您可以使用您选择的初始状态设置减速器。根据您的测试要求触发所有效果后,redux-saga-test-plan 将检查 reducer 是否已相应更改。