【问题标题】:Unit testing multiple sequential 'put' calls in redux saga在 redux saga 中对多个顺序“put”调用进行单元测试
【发布时间】:2018-02-25 15:38:37
【问题描述】:

我有一个已经编写好的 saga,其中包含 4-5 个 yield 并为它编写了适当的单元测试。但现在作为缺陷修正的一部分,我不得不在 saga 中的最后一个 yield put(actionB)(B) 效果之前添加另一个 yield put(actionA)(A) 效果。因此,正如预期的那样,我的一个测试用例失败了,之前测试过 (B)。

所以,由于我只是在 saga 中添加了另一个 yield,为了让我之前的测试正确运行,我只是在单元测试中添加了另一个 generator.next() 调用,以使其进入最后一个 yield。但由于某种原因,它并没有纠正它。

当再添加一个 yield put(action) 效果时,我需要做一些不同的事情吗?

对不起,如果我不能展示很多代码并且只能从概念上解释,因为我现在没有代码,但需要一个答案。因此,我们将不胜感激。

【问题讨论】:

    标签: redux-saga


    【解决方案1】:

    我意识到这个问题有点老了,但我在尝试解决同样的问题时遇到了这个问题,所以在这里发布答案。

    我把这个放在我测试这个传奇函数的开头

    beforeEach(() => { generator = sagaFunctionYouAreTesting(MOCK_ACTION_PAYLOAD);});

    如果 yield put(actionB)(B) 依赖于 yield put(actionA)(A) 的某种响应,您需要将其传递给您的下一个函数,如下所示

     // first we see that action A is called
      expect(generator.next().value.call).toEqual(
        call(
          api.actionA,
          'any params here'
        ).call
      );
    
     // lets pretend action A returns an array for action B to use
      const mockActionAResult = [{ id: '12345', name: 'foo' }];
    
      // then we check that action B is called
      expect(
        generator.next(mockActionAResult).value.call
      ).toEqual(call(api.actionB, 'any params here').call);
    
    // lets pretend action B returns success or failure
    const mockActionBResult = {status: 200}
    
    // then you could keep going down the line or check for something like a success 
      expect(
        generator.next(mockActionBResult).value
      ).toEqual(
        put({
          type: 'SUCCESS'
        })
      );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2021-11-21
      • 1970-01-01
      相关资源
      最近更新 更多