如何监视在玩笑中导入的函数
How to spy on a function that is imported in jest
在下面放入一个小片段:
import xyz from '../xyz'
function calculate() {
return xyz(arg1, arg2).catch((err) => {
func1()
func2()
})
}
export default calculate
我只是想断言 xyz 是开玩笑的。我该怎么做 ?
我尝试了以下但不起作用:
import * as myModule from '../xyz'
import calculate from '../../calculate'
const mock = jest.spyOn(myModule, 'xyz')
mock.mockReturnValue('mocked value')
const op = calculate()
expect(op).toBe('mocked value')
这给了我以下错误:
Cannot spy the xyz property because it is not a function; undefined given instead
您可以像这样模拟模块:
import calculate from '../../calculate'
jest.mock('../xyz', ()=> () => Promise.resolve('mocked value'))
it('does something', async()=>{
const op = await calculate()
expect(op).toBe('mocked value')
})
如果您需要来自 mock 的不同 return 值,您需要 mock 模块以便它 return 成为间谍。然后你必须导入模块,你可以在测试期间设置 return 值:
import calculate from '../../calculate'
import myModule from '../xyz'
jest.mock('../xyz', ()=> jest.fn())
it('does something', async() => {
myModule.mockImplementation(() => () => Promise.resolve('mocked value'))
const op = calculate()
expect(op).toBe('mocked value')
})
it('does something else', async() => {
myModule.mockImplementation(() => () => Promise.resolve('another value'))
const op = await calculate()
expect(op).toBe('another value')
})
it('does fail', async() => {
myModule.mockImplementation(() => () => Promise.reject('some Error')
try{
const op = await calculate()
}catch (e){
expect(e).toBe('some Error')
}
})
在下面放入一个小片段:
import xyz from '../xyz'
function calculate() {
return xyz(arg1, arg2).catch((err) => {
func1()
func2()
})
}
export default calculate
我只是想断言 xyz 是开玩笑的。我该怎么做 ?
我尝试了以下但不起作用:
import * as myModule from '../xyz'
import calculate from '../../calculate'
const mock = jest.spyOn(myModule, 'xyz')
mock.mockReturnValue('mocked value')
const op = calculate()
expect(op).toBe('mocked value')
这给了我以下错误:
Cannot spy the xyz property because it is not a function; undefined given instead
您可以像这样模拟模块:
import calculate from '../../calculate'
jest.mock('../xyz', ()=> () => Promise.resolve('mocked value'))
it('does something', async()=>{
const op = await calculate()
expect(op).toBe('mocked value')
})
如果您需要来自 mock 的不同 return 值,您需要 mock 模块以便它 return 成为间谍。然后你必须导入模块,你可以在测试期间设置 return 值:
import calculate from '../../calculate'
import myModule from '../xyz'
jest.mock('../xyz', ()=> jest.fn())
it('does something', async() => {
myModule.mockImplementation(() => () => Promise.resolve('mocked value'))
const op = calculate()
expect(op).toBe('mocked value')
})
it('does something else', async() => {
myModule.mockImplementation(() => () => Promise.resolve('another value'))
const op = await calculate()
expect(op).toBe('another value')
})
it('does fail', async() => {
myModule.mockImplementation(() => () => Promise.reject('some Error')
try{
const op = await calculate()
}catch (e){
expect(e).toBe('some Error')
}
})