为什么开玩笑不嘲笑这个模块?

时间:2017-01-20 11:34:28

标签: javascript mocking jestjs

我有一个应该调用本地获取包装器的模块。要检查get模块是否正确调用了fetch包装器,我会嘲笑它并像这样返回一个间谍:

// get.js
import fetch from '../fetch'

const get = (endpoint, token) => {
  const headers = new Headers()

  if (token) {
    headers.append('Authorization', `Bearer ${token}`)
  }

  const init = {
    headers,
    method: 'GET'
  }

  return fetch(new Request(endpoint, init))
}

export default get
// get.test.js
import 'isomorphic-fetch'
import get from './get'

describe('get', () => {
  it('calls fetch with a request', () => {
    // I'm expecting this spy to be called by get
    const mockFetch = jest.fn()
    jest.mock('../fetch', () => jest.fn(mockFetch))

    get('endpoint', 'token')

    expect(mockFetch).toHaveBeenCalled()
  })
})

但是当我运行它时,jest失败了:

expect(jest.fn()).toHaveBeenCalled()

Expected mock function to have been called.

那么为什么它不会调用模拟器?

1 个答案:

答案 0 :(得分:0)

问题是所有jest.mock语句都被提升到代码块的顶部。因此,即使您将其写入测试中间,它也将作为测试的第一个语句运行,并且无法获得特定的返回值。那么如何解决这个问题。首先是你的import语句之后的mock语句,以明确测试中没有发生的模拟。然后在测试中导入模块。所以这将是你的模拟语句中jest.fn()的结果。由于fetch现在是间谍,您可以对此进行测试,fetch被调用。

import 'isomorphic-fetch'
import get from './get'
import fetch from '../fetch'
jest.mock('../fetch', () => jest.fn())

describe('get', () => {
  it('calls fetch with a request', () => {
    get('endpoint', 'token')
    expect(fetch).toHaveBeenCalled()
  })
})