В unit-тестировании Mock (англ. “мок”) - это объект, который имитирует поведение реального объекта и предоставляет специальные методы для проверки вызовов и параметров, передаваемых в эти методы. Mock обычно используется, когда необходимо проверить, как объект взаимодействует с другими объектами, которые он использует.

Mock может имитировать различные объекты, такие как базы данных, файловые системы, сетевые соединения, а также другие объекты, которые сложно воссоздать в тестовой среде или которые могут повлиять на результаты тестирования.

Mock может быть реализован как самостоятельный объект или как часть другого объекта. Он может быть создан вручную или с помощью специальных инструментов.

Использование Mock в unit-тестировании позволяет проверять, как объект взаимодействует с другими объектами, и контролировать его поведение в тестовых условиях. Это позволяет улучшить качество и надежность программного обеспечения, а также ускорить процесс тестирования.

Пример

Представим, что у нас есть функциональный компонент UserProfile, который зависит от сервиса UserService для получения информации о пользователе. Сервис UserService имеет метод getUserById, который принимает на вход идентификатор пользователя и возвращает его данные.

Мы можем создать Mock объект UserServiceMock, который будет имитировать работу сервиса, и затем использовать его для проверки, как UserProfile взаимодействует с сервисом.

const UserServiceMock = {
  getUserById: jest.fn((id) => ({ id: 1, name: "John" })),
};

Затем мы можем создать функциональный компонент UserProfile, который будет использовать этот Mock сервис.

import React, { useState, useEffect } from 'react';
 
const UserProfile = ({ userId, userService }) => {
  const [user, setUser] = useState(null);
 
  useEffect(() => {
    const fetchUser = async () => {
      const fetchedUser = await userService.getUserById(userId);
      setUser(fetchedUser);
    };
 
    fetchUser();
  }, [userId, userService]);
 
  return (
    <div>
      {user ? (
        <div>
          <div>User ID: {user.id}</div>
          <div>User Name: {user.name}</div>
        </div>
      ) : (
        <div>Loading...</div>
      )}
    </div>
  );
};

Теперь мы можем протестировать компонент UserProfile с использованием Mock сервиса UserServiceMock.

import { render, screen } from '@testing-library/react';
import '@testing-library/jest-dom/extend-expect';
 
test('fetches user data and displays it', async () => {
  render(<UserProfile userId={1} userService={UserServiceMock} />);
  
  // Проверяем, что метод getUserById был вызван с правильным аргументом
  expect(UserServiceMock.getUserById).toHaveBeenCalledWith(1);
 
  // Ждем, пока данные загрузятся и отобразятся
  const userIdElement = await screen.findByText(/User ID: 1/i);
  const userNameElement = await screen.findByText(/User Name: John/i);
 
  expect(userIdElement).toBeInTheDocument();
  expect(userNameElement).toBeInTheDocument();
});

Таким образом, использование Mock объекта позволяет нам проверять, как компонент взаимодействует с другими объектами, и контролировать его поведение в тестовых условиях.


Назад