代码之家  ›  专栏  ›  技术社区  ›  MadMatt

使用来自请求的动态有效负载测试Redux Saga

  •  0
  • MadMatt  · 技术社区  · 6 年前

    我试图理解带有ReduxSaga测试计划的测试,但我有点被动态有效负载所困扰。

    这是我的传奇:

    function* getCheapCars() {
        try {
            const response = yield call(fetch, '/api/home')
            const cars = yield call([response, response.json])
            yield put({ type: types.FETCH_DATA_SUCCESS, cars })
        } catch (error) {
            yield put({ type: types.FETCH_DATA_ERROR, error })
        }
    }
    

    下面是测试:

    it('just works!', () => {
        return expectSaga(saga)
            .take('FETCH_DATA_SUCCESS')
            .put({ type: 'FETCH_DATA_SUCCESS', cars })
            .dispatch({ type: 'FETCH_DATA_SUCCESS', cars })
            .run()
    })
    

    我可能是错的(我对Saga完全陌生),但如何从请求中获得动态有效载荷——在本例中,是汽车。汽车代表了多个“帖子”的数组,包括标题、slug、id和许多其他字段。我应该创建一个具有完全相同字段的假对象吗?

    我需要一点关于减速器测试的帮助,基本上这里有相同的故事和这个测试通过了,但它不应该。因为我不希望项目的数组是空的,但是数组的长度是4(车)。

    it('just works!', async () => {
       const { storeState } = await expectSaga(saga)
         .withReducer(reducer)
         .run()
    
       expect(storeState).toEqual({
         loading: false,
         error: null,
         items: []
       })
    })
    

    有什么我不明白的吗?事先谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   kartikag01    6 年前

    我在使用ReduxSaga测试计划进行的Saga测试中了解到的是,我们应该模拟API调用并选择调用。

    模拟是通过provide方法完成的,因此不会调用真正的API。

    const mockResponse = []; // your api response 
    it('getCheapCars test', () => expectSaga(getCheapCars)
      .provide([
        [call(fetch, '/api/home'), mockResponse],
      ])
      .put({ type: types.FETCH_DATA_SUCCESS, cars: mockResponse })
      .run())