Мокирование зависимостей

Мокирование зависимостей — важный инструмент при разработке и тестировании приложений на 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()])
}));

Техники мокирования в Inferno

Мок через 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' }));
  // рендеринг компонента и проверка результата
});

Такой подход позволяет полностью контролировать сетевые ответы и проверять обработку ошибок.


Комбинированное мокирование

Иногда требуется комбинировать мокирование нескольких зависимостей одновременно:

  • Компоненты через HOC или замену на заглушки.
  • Сервисы через jest.mock.
  • Состояние через хуки или пропсы.
  • Контекст для глобальных зависимостей.
  • Сетевые запросы через fetch/axios mock.

Это обеспечивает полную изоляцию тестируемого компонента и позволяет проверять его поведение в любых сценариях.


Практические рекомендации

  • Использовать моки для внешних зависимостей, а не для внутренних методов компонента.
  • Сохранять предсказуемость: мок должен возвращать стабильный результат.
  • Минимизировать количество слоёв мокирования, чтобы тест оставался читаемым.
  • Проверять корректность моков: неправильный мок может скрывать реальные ошибки.
  • Применять контекст для глобальных состояний, чтобы тестировать компоненты в условиях, близких к реальным.

Мокирование зависимостей позволяет создавать стабильные и быстрые тесты для Inferno-приложений, облегчает отладку и повышает качество кода.