javascript - 为什么 jest 不 mock 这个模块?

标签 javascript mocking jestjs

我有一个模块应该调用本地获取包装器。为了检查 get 模块是否正确调用 fetch 包装器,我模拟它并返回一个 spy ,如下所示:

// 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.

那么为什么它不调用模拟呢?

最佳答案

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

关于javascript - 为什么 jest 不 mock 这个模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41762727/

相关文章:

javascript - 未调用方法上的 Sinon.spy

javascript - Jest : Testing window. location.reload

javascript - Ajax promise 不起作用

c# - 如何对基于枚举的 switch 语句的默认情况进行单元测试

javascript - 如何附加用户输入?查询

c++ - 如何更改 C++ 中的静态方法行为?

flowtype - 如何让 Flow 知道 Jest 的全局变量(测试、期望等)?

import - 如何在 Jest 测试中使用我的 webpack 的 html-loader 导入?

javascript - 从浏览器发出 HTTP 请求,而不在请求 header 中发送任何 cookie

javascript - 为什么这个正则表达式在 Angular 上的匹配仅在 Safari 上失败?