PHP Profi

PHPUnit для начинающих. Часть 3: Тестовые «двойники» или Mock-объекты Перевод Серия 

php unit test PHPUnit stubs fake dummy spies mocks

Это третья часть серии "PHPUnit для начинающих". В этом руководстве мы объясним когда и как использовать тестовых "двойников" в тестах.

Когда использовать двойников

Как уже упоминалось в первой части данной серии статей, одной из мощнейших возможностей phpunit являются "двойники" для тестов. Очень часто в нашем коде функция одного класса вызывает функцию другого класса. В этом случае, мы имеем зависимость в этих двух классах. В частности, вызывающий класс имеет зависимость от вызываемого класса. Но как мы уже знаем из первой части, юнит-тест должен тестировать функциональную единицу, в этом случае, он должен проверить только в вызывающую функцию.

Чтобы решить эту проблему, мы можем использовать "двойника" для подмены вызываемого класса. Так как двойник может быть настроен возвращать предопределенные результаты, мы можем сосредоточиться на тестировании в вызывающей функции.


Типы тестовых "двойников"

Тестовый "двойник" (англ. test doubles) — это общий термин для объектов, которые мы используем, чтобы заменить реальные объекты. На наш взгляд, это очень полезно для классификации тестовых "двойников" по их назначению. Это не только облегчит нам понимание описанного тестируемого случая, но и сделает наш код более дружелюбным и читаемым для других.

Опираясь на пост Мартина Фаулера, есть пять типов тестовых "двойников":

  1. Dummy (манекены/заглушки) предназначены для работы в обход, но фактически никогда не используются. Обычно они просто используются чтобы заполнять список параметров.
  2. Fake (фальшивки) действительно имеют работающие реализации, но обычно имеют некоторое упрощение, которое делает их непригодными для боевого применения.
  3. Stubs (заглушки/огрызки) обеспечивают консервированные ответы на вызовы, сделанные во время теста, как правило, не отвечают вообще ни на что извне, кроме того, что запрограммировано для теста.
  4. Spies (шпионы) являются заглушками (stub-ом), которые, кроме того, регистрируют определенную информацию, основываясь на том, как они назывались. Одним из примеров этого может быть почтовый сервис, который записывает, сколько сообщений было отправлено.
  5. Mocks (подражатели/притворщики) запрограммированы с ожиданиями, которые формируют спецификацию вызова, который они ожидали получить. Они могут выбросить исключение, если они были вызваны не так, как они ожидали, и выполняют проверки, чтобы убедиться, что они получили все вызовы, которые они ожидали.

Как создать тестового "двойника"

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

Добавление "двойника" в наш первый unit-тест

Не имеет смысла использовать "двойника" для тестов нашего калькулятора, поскольку в настоящее время калькулятор класса не имеет зависимостей от других классов. Однако, чтобы продемонстрировать, как использовать "двойников" с помощью PhpUnit, мы создадим stub для класса Calculator и протестируем его.

Давайте добавим тест под названием testWithStub в наш существующий класс:

public function testWithStub()
{
    // Create a stub for the Calculator class.
    $calculator = $this->getMockBuilder('Calculator')
                       ->getMock();

    // Configure the stub.
    $calculator->expects($this->any())
               ->method('add')
               ->will($this->returnValue(6));

    $this->assertEquals(6, $calculator->add(100,100));
}
  1. getMockBuilder() метод создает заглушку (stub), похожую на объект нашего класса Calculator.
  2. getMock() возвращает объект этой заглушки.
  3. expects() говорит, что stub будет вызываться любое число раз.
  4. method() определяет, какой метод будет вызван.
  5. will() настраивает возвращаемое значение в stub.

Заключение

Мы завершили серию "PHPUnit для начинающих".
Вы должны были накопить достаточно знаний о PhpUnit, чтобы начать реализовывать unit-тесты в своём коде. Если вам требуется больше информации, можете обратиться к официальной документации и конкретно к разделу о "двойниках".

Надеюсь, это простое руководство помогло вам в понимании тестирования приложений.
Если вам понравился наш пост, читайте нас в Twitter, подписывайтесь на наши группы в Facebook, ВКонтакте, Google+. Мы будем рады продолжать для вас.

2016-04-21 alek13 оригинал
General Food

Комментарии

авторизуйтесь, чтобы оставить комментарий