以下是来自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数据的地方。
答案 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'] }
这是嘲笑的,也可以在以后预期