Имитация зависимостей с помощью PHPUnit
Создавайте имитационные объекты, чтобы изолировать отдельные компоненты и управлять поведением связанных объектов
«Имитация зависимостей с помощью 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 — локальная установка не требуется.
Все уроки этого курса
- Настройка PHPUnit и первый тест
- Проверки и методы тестов
- Поставщики данных для параметризованных тестов
- Имитация зависимостей с помощью PHPUnit