Как шпионить за функцией, которая импортируется в шутку - PullRequest
0 голосов
/ 06 марта 2019

Добавляю небольшой фрагмент ниже:

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

Это дает мне следующую ошибку:

Невозможно шпионить за свойством xyz, потому что оно нефункция;вместо него дано неопределенное значение

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете смоделировать модуль следующим образом:

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

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

если вам нужны отличные возвращаемые значения от вашего макета, вам нужно смоделировать модуль, чтобы он возвращал шпиона. Затем вам нужно импортировать модуль, и вы можете установить возвращаемое значение во время ваших тестов:

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

...