0

以下是来自 redux 文档的示例代码

describe('async actions', () => {
  afterEach(() => {
    nock.cleanAll()
  })

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

    const expectedActions = [
      { type: types.FETCH_TODOS_REQUEST },
      { type: types.FETCH_TODOS_SUCCESS, body: { todos: ['do something']  } }
    ]

    const store = mockStore({ todos: [] })

    return store.dispatch(actions.fetchTodos())
      .then(() => { // return of async actions
        expect(store.getActions()).toEqual(expectedActions)
      })
  })
})

为什么我们需要在这个单元测试中使用 nock?在此示例代码中,我没有看到任何使用 nock 数据的地方。

4

2 回答 2

2

Nock 用于模拟 http 请求 - 如果您模拟 http 请求,则意味着您的代码不会对服务器执行真正的 http 请求。

Nock(和任何其他 http 模拟库)覆盖本机 http 请求方法,因此永远不会发送真正的 http 请求。它有很多好处 - 例如,您不必等待实际的服务器响应,因为模拟请求会立即返回响应,当然您的测试与服务器无关。您可以专注于测试应用程序代码,而不必担心服务器——即使服务器不工作,您的测试也可以运行。

如果您不需要测试它,您不必明确使用模拟请求返回的数据 -nock在代码示例中使用的主要原因是防止向服务器发送实际的 http 请求,该FETCH_TODOS_REQUEST操作通常会发送。此外,即使在测试中没有明确使用模拟的响应数据,它也可能在应用程序代码中使用(可能FETCH_TODOS_SUCCESS操作需要todos返回数组),因此您必须模拟响应数据,以便您的应用程序获得它期望的数据。
如果不使用 nock,测试将花费更多时间,因为将向服务器发送真正的 http 请求。

于 2017-03-31T08:47:37.540 回答
0

主要是因为在这个测试中,我们对actions.fetchTodos()产生的动作感兴趣。此操作将调用/todos端点,从而返回带有一些数据的操作。由于我们只对动作中包含的数据感兴趣,所以我们只是模拟它。

Nock 在内部拦截了对/todos的真正fetch调用并返回成功的 200 代码,从而使 redux 存储可以继续。

您要查找的数据是

{ todos: ['do something']  }

这是被嘲笑的,也是稍后预期的

于 2017-03-31T09:09:16.350 回答