Ответ
Мокирование — это техника в модульном тестировании, при которой реальные зависимости объекта заменяются контролируемыми объектами-заглушками (моками). Это позволяет изолировать тестируемый код, задавать ожидаемое поведение зависимостей и проверять взаимодействие с ними.
Зачем это нужно: Например, чтобы протестировать сервис оплаты, не совершая реальных транзакций через платежный шлюз. Мы создаем мок шлюза, который всегда возвращает успешный ответ.
Пример с PHPUnit и моком:
// Интерфейс внешней зависимости
interface PaymentGatewayInterface {
public function charge(float $amount): bool;
}
// Класс, который мы тестируем
class PaymentService {
private PaymentGatewayInterface $gateway;
public function __construct(PaymentGatewayInterface $gateway) {
$this->gateway = $gateway;
}
public function processOrder(float $amount): bool {
// Бизнес-логика...
return $this->gateway->charge($amount);
}
}
// Тест с использованием мока
class PaymentServiceTest extends PHPUnitFrameworkTestCase {
public function testProcessOrderCallsGatewayWithCorrectAmount(): void {
// 1. Создаем мок объекта
$gatewayMock = $this->createMock(PaymentGatewayInterface::class);
// 2. Настраиваем ожидания: метод charge будет вызван ровно один раз с аргументом 100.0 и вернет true
$gatewayMock->expects($this->once())
->method('charge')
->with($this->equalTo(100.0))
->willReturn(true);
// 3. Внедряем мок и тестируем
$service = new PaymentService($gatewayMock);
$result = $service->processOrder(100.0);
// 4. Проверяем результат
$this->assertTrue($result);
}
}
В своей работе я часто использую моки для тестирования сервисов, которые работают с базой данных, внешними API, почтовыми рассылками или файловой системой. Это делает тесты быстрыми и независимыми от внешнего окружения.