Библиотека тестирования Jest React: как мне создать макет метода из некоторой библиотеки, который влияет только на один тестовый блок

#javascript #reactjs #unit-testing #jestjs #react-testing-library

#javascript #reactjs #модульное тестирование #jestjs #react-testing-library

Вопрос:

вопрос об использовании Jest для создания метода из сторонней библиотеки. итак, у меня есть компонент, реализованный следующим образом

 import {foo} from 'bar'
function Component() {
  // use foo somewhere in the component
}
  

и в тесте я пытался создать макет foo , поэтому

 import {foo} from 'bar'

jest.mock('bar')

test('test', () => {
 foo.mockReturnValue(...)
})
  

это работает нормально, но как только я перейду jest.mock('bar') к каждому отдельному test блоку, jest сообщит об ошибке, в которой говорится, что foo.mockReturnValue это не функция. например, так

 test('test', () => {
  jest.mock('bar')
  foo.mockReturnValue(...) // 👈🏻 error: `foo.mockReturnValue` is not a function
})
  

Проблема в том, что я хочу создавать макет bar на каждом test уровне, а не на глобальном уровне, который влияет на весь тестовый файл. есть ли способ сделать это?

Ответ №1:

Поскольку вы хотите выполнять макет foo на каждом уровне тестирования, имеет смысл сохранять bar mocked глобально и использовать beforeEach() или afterEach() сбрасывать mocked функцию до или после каждого запуска теста.

 import {foo} from 'bar';

jest.mock('bar');

afterEach(() => {
  foo.mockReset();
})

test('test', () => {
 foo.mockReturnValue(...);
})
  

Вы захотите использовать .mockReset() для удаления издевательских реализаций и возвращаемых значений из foo ; альтернативно, .mockClear() может использоваться, если реализация и возвращаемое значение для foo остаются неизменными для каждого теста. Подробнее о разнице читайте здесь .