为什么开玩笑不嘲笑这个模块?
Why does jest not mock this module?
我有一个模块应该调用本地获取包装器。为了检查 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()
})
})
但是当我 运行 它开玩笑地失败了:
expect(jest.fn()).toHaveBeenCalled()
Expected mock function to have been called.
那么它为什么不调用模拟?
问题是所有 jest.mock
语句都被提升到代码块的顶部。因此,即使您将它写入测试中间,它也将是 运行 作为测试的第一条语句,并且无法获得特定的 return 值。那么如何解决这个问题呢?首先将模拟语句放在导入语句之后,以明确模拟不会在测试中发生。然后在您的测试中导入模块。所以这将是您模拟语句中 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()
})
})
我有一个模块应该调用本地获取包装器。为了检查 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()
})
})
但是当我 运行 它开玩笑地失败了:
expect(jest.fn()).toHaveBeenCalled()
Expected mock function to have been called.
那么它为什么不调用模拟?
问题是所有 jest.mock
语句都被提升到代码块的顶部。因此,即使您将它写入测试中间,它也将是 运行 作为测试的第一条语句,并且无法获得特定的 return 值。那么如何解决这个问题呢?首先将模拟语句放在导入语句之后,以明确模拟不会在测试中发生。然后在您的测试中导入模块。所以这将是您模拟语句中 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()
})
})