使用来自请求的动态有效负载测试redux传奇

时间:2018-08-04 13:28:32

标签: testing redux-saga redux-saga-test-plan

我正在尝试了解redux-saga-test-plan的测试,但是我对动态有效载荷有些困惑。

这是我的传奇:

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()
})

我可能错了(我对传奇完全陌生),但是如何从请求中获取动态有效载荷-在这种情况下,它是汽车。汽车代表了多个带有标题,子弹,id和许多其他字段的“帖子”。我应该只创建一个字段完全相同的假对象吗?

在使用Reducer进行测试时,我需要一点帮助,基本上这是相同的传奇,并且此测试通过,但实际上不是。因为我不希望有空的项目数组,而是长度为4(汽车)的数组。

it('just works!', async () => {
   const { storeState } = await expectSaga(saga)
     .withReducer(reducer)
     .run()

   expect(storeState).toEqual({
     loading: false,
     error: null,
     items: []
   })
})

我有没有得到的东西吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

我在使用redux-saga-test-plan进行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())