为什么需要nock做http请求单元测试?

Why we need nock to do http request unit test?

下面是来自 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 用于模拟 http 请求 - 如果您模拟 http 请求,则意味着您的代码不会对服务器执行真正的 http 请求。

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

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

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

Nock 在内部拦截了真正的 fetch/todos 的调用和 returns 一个成功的 200 代码,使它成为可能redux store 继续。

您要找的数据是

{ todos: ['do something']  }

这被嘲笑了,以后也会期待