我们如何模拟 Redux 异步操作的获取?

How do we mock fetch for Redux Async Actions?

在 Redux 的 Writing Tests 部分,如果 store.dispatch 字面上调用 actions.fetchTodosstore.dispatch(actions.fetchTodos()) 怎么不调用 fetch 方法?

it('creates FETCH_TODOS_SUCCESS when fetching todos has been done', (done) => {
    nock('http://example.com/')
      .get('/todos')
      .reply(200, { todos: ['do something'] })

    const expectedActions = [
      { type: types.FETCH_TODOS_REQUEST },
      { type: types.FETCH_TODOS_SUCCESS, body: { todos: ['do something']  } }
    ]
    const store = mockStore({ todos: [] }, expectedActions, done)
    store.dispatch(actions.fetchTodos())
})

它正在调用 fetch 方法,但是 nock 行:

nock('http://example.com/')
  .get('/todos')
  .reply(200, { todos: ['do something'] })

截断 HTTP 请求,以便 fetch 简单地 returns 正确的数据(实际上没有到达端点)。

另一种选择是将对 fetch 的调用提取到另一个模块中——比如说,api——并在你的动作创建器中使用它。在测试中,您只需在 api 模块上模拟出适当的方法。