【问题标题】:Jest spyOn for redux saga 'call' gives error用于 redux saga 'call' 的 Jest spyOn 给出错误
【发布时间】:2021-08-05 06:40:24
【问题描述】:

所以我尝试使用 jest 从 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);

  });

我做错了什么?

【问题讨论】:

    标签: javascript reactjs unit-testing jestjs redux-saga


    【解决方案1】:

    用传统方法测试 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 将检查减速器是否已相应更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多