PHPUnit: получить аргументы для вызова фиктивного метода - PullRequest
13 голосов
/ 19 октября 2011

В настоящее время я работаю над проектом, в котором хранятся конфиденциальные данные, и поэтому должен иметь возможность удалить их по запросу.

Я хочу проверить, что моя сущность (пациент) сохраняется в базе данных с нулевым номером телефона. Первая идея сделать это: получить аргумент, переданный PatientDao::savePatient(PatientModel $patient), и взглянуть на его атрибут phoneNumber.

Итак, вот интерфейс PatientDao:

interface PatientDao {
    function savePatient(PatientModel $patient);
}

И код в моем тестовом файле:

$this->patientDao                    // This is my mock
            ->expects($this->once()) 
            ->method('savePatient'); // savePatient() must be called once

$this->controller->handleMessage(...);

$patient = ??; // How can I get the patient to make assertions with it ?

Как я могу это сделать, или есть ли другой способ убедиться, что пациент спасен с пустым номером телефона?

Ответы [ 3 ]

27 голосов
/ 19 октября 2011

Вы можете сделать утверждения в аргументе, используя returnCallback().Не забудьте вызывать функции подтверждения статически через PHPUnit_Framework_Assert, потому что вы не можете использовать self внутри замыкания.

$this->patientDao
        ->expects($this->once()) 
        ->method('savePatient')
        ->will($this->returnCallback(function($patient) {
            PHPUnit_Framework_Assert::assertNull($patient->getPhoneNumber());
        }));
7 голосов
/ 25 апреля 2014

Вот трюк, который я использовал. Я добавил этот закрытый метод в свой тестовый класс:

private function captureArg( &$arg ) {
    return $this->callback( function( $argToMock ) use ( &$arg ) {
        $arg = $argToMock;
        return true;
    } );
}

Тогда при настройке макета:

$mock->expects( $this->once() )
    ->method( 'someMethod' )
    ->with( $this->captureArg( $arg ) );

После этого $arg содержит значение аргумента, передаваемого макету.

4 голосов
/ 19 октября 2011

Заставьте метод объектов Mock вернуть первый аргумент:

$this->patientDao                    // This is my mock
            ->expects($this->once()) 
            ->method('savePatient') // savePatient() must be called once
            ->with($this->returnArgument(0));

Затем вы можете утверждать, что это NULL.

...