Существует ограничение на то, как вы можете тестировать модуль, содержащий функции, которые вызывают другие функции в том же модуле. См. Эту статью для более глубокого понимания . В этой статье есть несколько способов обойти эту проблему, поэтому я рекомендую сначала взглянуть на это, прежде чем углубляться в мою грубую реализацию, поскольку она может не работать с вашей структурой кода на 100%.
Рабочий пример:
CodesandBox
Утилиты
Слегка изменено по сравнению с вашим оригиналом, поэтому вам может понадобиться имитировать c в ваших утилитных модулях по мере необходимости.
const isDualScreen = () => {
return window.width > 1000 ? true : false;
};
const autoScreenAdd = element => {
if (utilMethods.isDualScreen()) {
utilMethods.dualScreenAdd(element);
} else {
utilMethods.singleScreenAdd(element);
}
};
const dualScreenAdd = element => {
return element;
};
const singleScreenAdd = element => {
return element;
};
// This is important, it allows you to mock the functions properly in your tests.
// Use this same structure in your singleScreenMethods and dualScreenMethods modules
const utilMethods = {
singleScreenAdd,
dualScreenAdd,
autoScreenAdd,
isDualScreen
};
export default utilMethods;
Тестовый пример
import utilMethods from "./utils";
describe("isSingleScreen", () => {
beforeEach(() => {
jest.clearAllMocks();
jest.spyOn(utilMethods, "isDualScreen").mockReturnValue(true);
});
it("autoScreenAdd", () => {
// Arrange
const singleScreenAddSpy = jest.spyOn(utilMethods, "singleScreenAdd");
const dualScreenAddSpy = jest.spyOn(utilMethods, "dualScreenAdd");
// Act
utilMethods.autoScreenAdd({});
// Assert
expect(singleScreenAddSpy).toHaveBeenCalledTimes(0);
expect(dualScreenAddSpy).toHaveBeenCalledTimes(1);
});
});