Как правильно смоделировать интерфейс в Mockery? - PullRequest
0 голосов
/ 22 мая 2019

Для модульного теста я создаю фиктивный объект через:

$passenger = M::mock(PassengerInterface::class);

Я передаю этот макет в службу, которую я хочу провести модульное тестирование. Эта служба пытается получить доступ к методу, который не определен и, следовательно, завершился с ошибкой, как и ожидалось, через:

[BadMethodCallException] Method Mockery_3_Dreamlines_BookingService_Bundle_Bundle_Entity_PassengerInterface::isInfant() does not exist on this mock object  

Таким образом, я определил метод для фиктивного объекта через

$passenger = M::mock(PassengerInterface::class)->shouldReceive('isInfant')->andReturn(false);

Тем не менее, это неожиданно не проходит тест через:

[PHPUnit_Framework_Exception] Argument 2 passed to Dreamlines\BookingService\Bundle\Bundle\Operator\ResponseModifier\InfantPriceModifier::adjustPrice()
must implement interface Dreamlines\BookingService\OperatorBundle\Entity\PassengerInterface,
Mockery\CompositeExpectation given 

Что я делаю не так?

1 Ответ

0 голосов
/ 22 мая 2019

Вы используете неверный синтаксис неправильно.

Mockery andReturn не возвращает фиктивный объект, но ожидание. Вам лучше создать экземпляр, изменить его, а затем использовать измененный intance:

$passenger = M::mock(PassengerInterface::class); // creates the mock
$passenger->shouldReceive("isInfant")->andReturn(false); // this returns an expectation, let's ignore that return value
// now you can use $passenger as expected
...