PHP Academy · Урок

Имитация зависимостей с помощью PHPUnit

Создавайте имитационные объекты, чтобы изолировать отдельные компоненты и управлять поведением связанных объектов

Урок 4 из 413 шагов

«Имитация зависимостей с помощью PHPUnit» — бесплатный урок PHP Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.

Зачем нужны имитации?

Имитация заменяет настоящую зависимость (базу данных, службу электронной почты, HTTP-клиент) управляемым заменителем, чтобы тесты выполнялись быстро, изолированно и предсказуемо.

createMock()

createMock(ClassName::class) создаёт объект-имитацию, реализующий все методы класса и по умолчанию возвращающий null.

<?php
$mailer = $this->createMock(Mailer::class);
// All methods return null by default

Ожидание вызовов методов

Используйте expects() с сопоставителями, такими как once(), exactly(3), never() и any(), чтобы проверить правильное количество вызовов методов.

<?php
$mailer->expects($this->once())
       ->method("send")
       ->with("user@example.com", "Welcome!");

Задание возвращаемых значений

Используйте willReturn(), чтобы имитируемый метод возвращал определённое значение.

<?php
$repo = $this->createMock(UserRepository::class);
$repo->method("find")
     ->willReturn(new User(id: 1, name: "Alice"));

willReturnMap()

Возвращайте разные значения в зависимости от аргумента с помощью willReturnMap().

<?php
$cache->method("get")
      ->willReturnMap([
          ["key:1", "value-one"],
          ["key:2", "value-two"],
      ]);

willThrowException()

Заставьте имитацию выбрасывать исключение, чтобы проверить пути обработки ошибок.

<?php
$repo->method("find")
     ->willThrowException(new DatabaseException("Connection lost"));

Сопоставители аргументов

Используйте сопоставители аргументов в with() для гибких утверждений: $this->anything(), $this->equalTo(), $this->isInstanceOf().

<?php
$logger->expects($this->once())
       ->method("log")
       ->with($this->stringContains("error"));

Частичные имитации (getMockBuilder)

Используйте getMockBuilder() вместе с onlyMethods(), чтобы имитировать определённые методы, сохраняя настоящие реализации остальных.

<?php
$svc = $this->getMockBuilder(EmailService::class)
            ->onlyMethods(["sendRaw"])
            ->getMock();
$svc->method("sendRaw")->willReturn(true);

Шаблон шпиона

Шпион записывает все вызовы, чтобы после выполнения можно было проверить их — имитации PHPUnit могут работать как шпионы при использовании any() и сохранении аргументов.

Внедрение имитаций

Передавайте имитации в тестируемый класс через внедрение в конструктор — это стандартный шаблон для тестируемого и слабо связанного кода.

<?php
$service = new NotificationService($mailer, $logger);
$service->notify($user);

Имитации интерфейсов и конкретных классов

Имитация интерфейсов предпочтительнее: детали реализации не проникают в тест, и тесты остаются корректными, даже если настоящая реализация изменится.

Итоги

Используйте createMock() для изоляции зависимостей. Применяйте expects()->method()->with()->willReturn(), чтобы задавать ожидания и заменяемые значения. Внедряйте имитации через конструктор.

Быстрая проверка

Какой метод заставляет имитацию возвращать определённое значение?

Можно начать бесплатно

Изучай PHP с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
49
Уроки
195

Часто задаваемые вопросы

Урок «Имитация зависимостей с помощью PHPUnit» бесплатный?

Да — полный текст урока «Имитация зависимостей с помощью PHPUnit» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.

Чему я научусь в уроке «Имитация зависимостей с помощью PHPUnit»?

Создавайте имитационные объекты, чтобы изолировать отдельные компоненты и управлять поведением связанных объектов Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать PHP Academy?

Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Имитация зависимостей с помощью PHPUnit»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке PHP Academy?

Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Настройка PHPUnit и первый тест
  2. Проверки и методы тестов
  3. Поставщики данных для параметризованных тестов
  4. Имитация зависимостей с помощью PHPUnit
← Назад к PHP Academy