Мокирование зависимостей — важный инструмент при разработке и тестировании приложений на JavaScript. В контексте Inferno оно позволяет изолировать компоненты, контролировать внешние данные и упрощать юнит-тестирование. Основная цель мокирования — заменить реальные зависимости (API-запросы, сервисы, модули) фиктивными реализациями для предсказуемого поведения.
1. Мокирование компонентов
Компоненты в Inferno можно мокировать для изоляции тестируемого блока. Вместо использования реального дочернего компонента создаётся простой заглушечный компонент:
import { h } from 'inferno';
const MockChild = ({ text }) => <div>{text}</div>;
При использовании мок-компонента тест становится более стабильным, так как исключается влияние внутренней логики дочернего компонента.
2. Мокирование функций и сервисов
Часто компоненты зависят от внешних функций или сервисов. Эти зависимости можно заменять на моки с использованием Jest или Sinon:
// Реальный сервис
export const fetchData = async () => {
const response = await fetch('/api/data');
return response.json();
};
// Мок для теста
jest.mock('./services', () => ({
fetchData: jest.fn().mockResolvedValue({ id: 1, name: 'Test' })
}));
Такой подход позволяет тестировать поведение компонентов без реальных сетевых запросов.
3. Контролируемые состояния
Inferno-компоненты часто используют локальное состояние. Для мокирования состояния применяются методы рендеринга с предустановленными пропсами или хуками состояния:
import { useState } from 'inferno-hooks';
const TestComponent = ({ initialCount }) => {
const [count, setCount] = useState(initialCount);
return <div>{count}</div>;
};
В тесте состояние можно задавать через пропсы или мок-версию хука:
jest.mock('inferno-hooks', () => ({
useState: jest.fn().mockReturnValue([10, jest.fn()])
}));
Мок через HOC (Higher-Order Component)
HOC позволяет оборачивать компонент и заменять его зависимости:
const withMockedService = (Component, mockService) => props =>
<Component {...props} service={mockService} />;
Использование:
const MockedComponent = withMockedService(MyComponent, { fetchData: () => ({ id: 1 }) });
Мок через контекст
Контексты в Inferno удобно использовать для мокирования глобальных зависимостей, таких как темы или состояния авторизации:
import { createContext } from 'inferno';
const AuthContext = createContext();
const TestWrapper = ({ children }) => (
<AuthContext.Provider value={{ user: { id: 1, name: 'Test' } }}>
{children}
</AuthContext.Provider>
);
Частая необходимость — тестировать компоненты, использующие fetch или
axios. Для этого применяются мок-объекты и библиотеки типа
jest-fetch-mock:
import fetchMock from 'jest-fetch-mock';
fetchMock.enableMocks();
beforeEach(() => {
fetch.resetMocks();
});
it('должен корректно рендерить данные', async () => {
fetch.mockResponseOnce(JSON.stringify({ id: 1, name: 'Test' }));
// рендеринг компонента и проверка результата
});
Такой подход позволяет полностью контролировать сетевые ответы и проверять обработку ошибок.
Иногда требуется комбинировать мокирование нескольких зависимостей одновременно:
Это обеспечивает полную изоляцию тестируемого компонента и позволяет проверять его поведение в любых сценариях.
Мокирование зависимостей позволяет создавать стабильные и быстрые тесты для Inferno-приложений, облегчает отладку и повышает качество кода.