#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();
Еще раз извините, и, возможно, это кому-то полезно.