Макет служебной функции, используемой при загрузке скрипта

#reactjs #unit-testing #jestjs #mocking

#reactjs #модульное тестирование #jestjs #издевательство

Вопрос:

Для простоты я создал образец приложения в stackblitz.

Компонент Hello использует служебную функцию, которую мне нужно смоделировать, чтобы протестировать ее.

 const hmmm = mockMe();

const Hello = () => (
  <div>
    <h1>Hello StackBlitz!</h1>
    <p>{hmmm}</p>
  </div>
);
  

Я попробовал несколько способов издевательства над функцией, например:

 import * as utils from '../utils';

describe('Hello component', () => {
    it('should mock the utility function', () => {
        jest.spyOn(utils , 'mockMe').mockReturnValue("Mocked!");
        // render the component and test it
    }
}

  

Моя проблема в том, что Hello.js запускается перед тестовым файлом. Таким образом, он выполняет служебную функцию перед применением макета.

Единственное решение, которое я мог придумать, — это изменить код компонента и переместить вызов утилиты внутри функции рендеринга. Я хотел бы избежать этого изменения.

Есть ли способ имитировать служебную функцию и сохранить код без изменений?

Комментарии:

1. Вы, кажется, ни к jest.mock чему. Существуют различные варианты взаимодействия с модулями на объекте Jest: jestjs.io/docs/en/jest-object

2. Если я изменю свой код таким образом, чтобы функция вызывалась внутри функции рендеринга, макет работает просто отлично. Вы уверены, что я должен использовать jest.mock? Несмотря на это, его добавление не повлияло на мой тест, и макет по-прежнему не работает.

3. Всем, кто голосует за закрытие, поскольку «нуждается в большем внимании» (или по любой другой причине в этом отношении) — пожалуйста, оставьте комментарий о том, чего вам не хватает, чтобы я мог улучшить вопрос. Спасибо!

Ответ №1:

Перед использованием методов из utils вам нужно смоделировать utils папку. Например, jest.mock('../utils');

Комментарии:

1. Вероятно, вы пропустили эту строку: jest.spyOn(utils , 'mockMe').mockReturnValue("Mocked!");