Заглушка для формального параметра, переданного по ссылке в PHPSpec/Prophecy

У меня есть метод в PHP, который выглядит так:

<?php
class SomeClass
{
    public function isEntitledToDiscount(GuestModel $who, $onWhat, &$discountAmount = null)
    {
        $discountAmount = 10;
        return true;
    }
}

Есть ли способ заглушить $discountAmount в PHPSpec? Допустим, у меня есть класс, который я тестирую, и я внедрил $someService через конструктор. В моей спецификации я использую:

<?php
$someService->isEntitledToDiscount($guest, $ticket, $discountAmount)->willReturn(true);

который создает заглушку для возвращаемого значения метода. Как я могу сделать это с формальным параметром $discountAmount?


person Janusz Slota    schedule 06.02.2014    source источник


Ответы (1)


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

Ваша проблема на самом деле связана с prohpecy, поэтому вы можете прочитать его документы: https://github.com/phpspec/prophecy

Prophecy (и PhpSpac) усложняют некоторые вещи. В большинстве случаев это означает, что вы пытаетесь ошибиться в своем дизайне.

Вы можете попробовать следующее, но я не думаю, что вы получите ссылку на свою переменную:

$someService->isEntitledToDiscount($guest, $ticket, $discountAmount)
    ->will(function ($arguments) {
        // do your evil
    });

Рекомендуем прочитать: Разделение запросов команд.

person Jakub Zalas    schedule 09.02.2014
comment
Как это может быть ответом на вопрос ОП? - person Markus Malkusch; 01.11.2015