Jest manual издевается над create-react-app: как использовать фиктивные значения в тесте

#reactjs #unit-testing #jestjs #mocking #create-react-app

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

Вопрос:

У меня есть проект React, настроенный с помощью create-react-app. В проекте есть Configuration класс, который содержит значения, зависящие от среды. Это выглядит так (свернутая версия для иллюстрации):

 # src/Configuration.js
class Configuration {
  getBackendUrl() { return "https://somewhere.com/" }
}
export default new Configuration();
  

Поскольку этот класс конфигурации широко используется среди компонентов, существует ручной макет, устанавливающий правильные значения для тестирования:

 # src/__mocks__/Configuration.js
class Configuration {
  getBackendUrl = jest.fn(() => {return "http://localhost:3001" });
}
export default new Configuration();
  

Макет загружается глобально в setupTests.js :

 # src/setupTests.js
jest.mock('./Configuration');
  

Все тесты, в которых Configuration класс используется неявно, работают правильно и используют фиктивные значения.

Но теперь у меня есть тест, в котором я хочу подтвердить фактические фиктивные значения Configuration класса. Следующий тестовый код сокращен до основной сути, на самом деле я использую nock для издевательства над сервером API, а затем проверки правильности обработки в redux.

 # src/somemodule/demo.test.js
import Configuration from '../Configuration';

describe('somemodule/demo', () => {
  it('uses correct configuration values', () => {
    expect(Configuration.getBackendUrl()).toEqual("http://localhost:3001")
  });
});
  

Проблема в том, что Configuration.getBackendUrl() это всегда undefined . Могу ли я каким-то образом добиться того, чтобы возвращалось фиктивное значение?

Я мог бы исправить это, вручную перезаписав макет в beforeEach методе набора тестов следующим образом, но я бы предпочел избежать дублирования : Configuration.getBackendUrl.mockImplementation(() => 'http://localhost:3001') .

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: добавлен фактический используемый код макета.

Ответ №1:

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

На самом деле в макете Configuration использовался следующий код (вопрос теперь скорректирован с его помощью):

 # src/__mocks__/Configuration.js
class Configuration {
  getBackendUrl = jest.fn(() => {return "http://localhost:3001" });
}
export default new Configuration();
  

Это всегда будет возвращать MockInstance метод per и, следовательно, неопределенный в тесте.
Если макет исправлен, чтобы не использовать jest.fn вызовы, тогда он работает:

 # src/__mocks__/Configuration.js
class Configuration {
  getBackendUrl(){ return "http://localhost:3001" };
}
export default new Configuration();
  

Еще раз извините, и, возможно, это кому-то полезно.