Устали помнить о разнице между издевательствами, партиалами и шпионами в Mockery? Да, поэтому я создал double()
— простой вспомогательный метод, упрощающий использование Mockery.
При написании тестов я не хочу думать о различиях между фейками , моками и шпионами . Я просто хочу создать общий тестовый дубль и сосредоточиться на написании своего теста. Это обобщение распространено в других средах тестирования, таких как RSpec, td.js и других.
Чтобы установить последнюю версию помощника double()
, выполните команду:
composer require --dev jasonmccreary/test-double
В любое время, когда вам нужно создать тестовый дубль, просто вызовите double()
По умолчанию double()
возвращает объект, который позволит вам заглушить методы, а также проверить вызовы методов.
<?php
$ td = double ();
$ td -> shouldReceive ( ' someMethod ' )-> andReturn ( 5 );
$ td -> someMethod (); // returns 5
$ td -> unstubbedMethod (); // returns null, does not throw an exception
$ td -> anotherMethod ();
$ td -> shouldHaveReceived ( ' anotherMethod ' );
В Mockery этот тестовый дубль эквивалентен Mockery::mock()->shouldIgnoreMissing()
или, в последних версиях, Mockery::spy()
.
Вы также можете передать double()
ссылку на класс или интерфейс. Это создаст тестовый объект, расширяющий класс или реализующий интерфейс. Это позволяет двойнику передавать любые подсказки типов или проверки типов в вашей реализации.
<?php
$ td = double (Str::class);
$ td -> shouldReceive ( ' length ' )-> andReturn ( 5 );
$ td -> length (); // 5
$ td -> substr ( 1 , 3 ); // null
$ td instanceof Str; // true
$ td -> shouldHaveReceived ( ' substr ' )-> with ( 1 , 3 );
Наконец, double()
принимает второй аргумент passthru . По умолчанию passthru имеет false
. Если установлено значение true
, тестовый объект будет передавать любые вызовы методов базовому объекту.
В Mockery это эквивалентно Mockery::mock(Number::class)->shouldDeferMissing()
.
<?php
class Number
{
public function one ()
{
return 1 ;
}
public function random ()
{
return 5 ;
}
}
$ td = double (Number::class, true );
$ td -> shouldReceive ( ' random ' )-> andReturn ( 21 );
$ td -> random (); // 21
$ td -> one (); // 1
$ td instanceof Number; // true
$ td -> shouldHaveReceived ( ' one ' );
Примечание. passthru можно использовать только при создании тестового двойника со ссылкой на класс, поскольку это единственный раз, когда существует базовая реализация.
В конце концов, double()
— это самоуверенный способ создания тестовых объектов для вашего базового кода. Если это не соответствует вашим потребностям, вы всегда можете создать Mockery::mock()
напрямую. Однако это, скорее всего, является признаком того, что вы тестируете свою реализацию способом, который не отражает поведение реального мира. Помните, double()
возвращает объект, реализующий MockeryInterface
. Таким образом, его можно рассматривать как любой другой объект Mockery::mock()
.