Mock-объект – Тестирование кода

Mock-объект (от англ. mock object, буквально: «объект-пародия», «объект-имитация», а также «подставка») — в объектно-ориентированном программировании — тип объектов, реализующих заданные аспекты моделируемого программного окружения.

Mock-объект представляет собой конкретную фиктивную реализацию интерфейса, предназначенную исключительно для тестирования.

Зачем же нам нужны MOCKи?

Часто бывает что наш код зависит от других частей нашего проекта и тестируя его вы цепляете код, который вы уже оттестировали, зачем же его трогать? Когда вы точно знаете как ответит вам внешний ресурс, то вы можете просто сделать “пустышку, затычку, ну или как его еще называют MOCK”.

Как это работает? Представьте что вам нужно сделать запрос в банк и получить ваши транзакции за месяц, вы знаете формат ответа и не хотите каждый раз делать реальный запрос в банк, чтобы во первых не делать лишних походов в интернет (сэкономить время), во вторых не тратить свой лимит запросов, если такой имеется.

Итак, все, что вам нужно сделать, это знать ответ банка в данной ситуации, кладем ответ в файлик, например в “data/transaction_checker_1.json”, далее мокаем нашего клиента, который инъектится в наш сервис (паттерн DI, Dependency Injection) и так же мокаем методы клиента, в нашем случае объект “ответ” – Response, тоже необходимо мокнуть, так как он должен нам вернуть статус и тело ответа. Ниже представлен фрагмент кода из PHPUnit теста.


...
$client = $this->getMockBuilder(Client::class)
    ->disableOriginalConstructor()
    ->getMock();

$client->method('createRequest')
    ->willReturn(null);

$response = $this->getMockBuilder(Response::class)
    ->disableOriginalConstructor()
    ->getMock();

$json = \file_get_contents(__DIR__ . '/data/transaction_checker_1.json');

$response->method('getBody')
    ->willReturn($json);

$response->method('getStatusCode')
    ->willReturn(200);

$client->method('send')
    ->willReturn($response);
$checker = new TransactionChecker($client, $yaml, $kernel->getContainer()->get('doctrine'));
$checker->checkTransactions();

...

Если вы проникнитесь этой идеей, то вам станет гораздо проще тестировать сложные сервисы, которые имеют массу зависимостей, данный метод позволяет возвращать из методов МОСК объектов необходимые вам данные в зависимости от параметров, которые переданы в метод, индекса вызова метода (первый вызов, второй, третий), на каждый можно вернуть разные значения, а так же выбрасывать исключения.

Подпишитесь на рассылку новых статей

Подпишитесь на рассылку свежих статей и присоединяйтесь к 7 остальным подписчикам.