首页 > 解决方案 > 使用来自请求的动态负载测试 redux saga

问题描述

我正在尝试使用 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()
})

我可能错了(我对 saga 完全陌生),但是如何从请求中获取动态有效负载 - 在这种情况下是汽车。Cars 代表多个“帖子”的数组,其中包含 title、slug、id 和许多其他字段。我应该只创建一个具有完全相同字段的假对象吗?

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

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

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

有什么我不明白的吗?提前致谢。

标签: testingredux-sagaredux-saga-test-plan

解决方案


我在使用 redux-saga-test-plan 进行 saga 测试时所理解的是,我们应该模拟我们的 api 调用和 select 调用。

Mock 是通过 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())

推荐阅读