如何监视在 jest 中导入的函数

use*_*242 14 javascript unit-testing jestjs jest-fetch-mock

在下面放入一个小片段:

import xyz from '../xyz'
function calculate() {
  return xyz(arg1, arg2).catch((err) => {
    func1()
    func2()
  })
}
export default calculate
Run Code Online (Sandbox Code Playgroud)

我只是想断言 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')
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

无法监视 xyz 属性,因为它不是函数;未定义给定代替

And*_*rle 8

您可以像这样模拟模块:

import calculate from '../../calculate'
jest.mock('../xyz', ()=> () => Promise.resolve('mocked value'))

it('does something', async()=>{
  const op = await calculate()
  expect(op).toBe('mocked value')
})

Run Code Online (Sandbox Code Playgroud)

如果您需要来自模拟的不同返回值,则需要模拟该模块,以便它返回一个间谍。然后你必须导入模块,你可以在测试期间设置返回值:

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')
  }
})

Run Code Online (Sandbox Code Playgroud)

  • 我不认为这回答了问题,OP 想知道他们如何监视一个函数,而答案则嘲笑该函数。我可能是错的,但是如果你监视你保留该函数的实现,如果你模拟你删除它。 (17认同)
  • 这段代码不起作用,至少在 Typescript 中是这样。`myModule` 是原始函数,所以我不明白它如何具有 `mockImplementation` 属性。当然不是首先执行这一行: `jest.mock('../xyz', ()=> jest.fn())` (3认同)