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

时间:2017-03-31 07:30:45

标签: node.js reactjs redux nock

以下是来自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数据的地方。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

您正在寻找的数据是

{ todos: ['do something']  }

这是嘲笑的,也可以在以后预期