PHPUnit:获取模拟方法调用的参数

PHPUnit:获取模拟方法调用的参数,php,mocking,phpunit,Php,Mocking,Phpunit,我目前正在从事一个存储敏感数据的项目,因此必须能够根据请求删除这些数据 我想测试我的实体(患者)是否以空电话号码保存到数据库中。第一个方法是:将参数传递给PatientDao::savePatient(PatientModel$patient),并查看其phoneNumber属性 下面是PatientDao界面: interface PatientDao { function savePatient(PatientModel $patient); } 以及我的测试文件中的代码: $th

我目前正在从事一个存储敏感数据的项目,因此必须能够根据请求删除这些数据

我想测试我的实体(患者)是否以空电话号码保存到数据库中。第一个方法是:将参数传递给
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 ?

我如何才能做到这一点,或者是否有其他方法确保患者以空电话号码保存?

使Mock objects方法返回第一个参数:

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

然后,您可以断言它是
NULL

您可以使用
returnCallback()
对参数进行断言。记住通过
PHPUnit\u Framework\u assert
静态调用assert函数,因为不能在闭包内使用
self

$this->patientDao
        ->expects($this->once()) 
        ->method('savePatient')
        ->will($this->returnCallback(function($patient) {
            PHPUnit_Framework_Assert::assertNull($patient->getPhoneNumber());
        }));

这是我使用的技巧。我将此私有方法添加到我的测试类:

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
包含传递给mock的参数值。

有一件事-在闭包中,您仍然可以访问$this,在这种情况下,它会为您提供:

$this->patientDao
->预期($this->once())
->方法('savePatient')
->will($this->returnCallback(函数($patient){
$this->assertNull($patient->getPhoneNumber());
}));

我从未在“with”中使用过$this->return*。。。看起来很有趣!但是我以后如何在测试函数中获得值本身,它实际上是如何返回给我的?你是在使用mock进行内省吗?我不这么认为。。。我想没有。我想应该是
->will(…)
,但我以前没有使用过
returnArgument()
。但是我认为除非DAO返回
savePatient()
返回的任何内容,否则这不会起作用。在这里做了一次处理。注意:如果参数包含多个参数,则需要将它们全部包含在内,即使您不想全部测试它们。e、 g.
$this->returnCallback(函数($patient,$someOtherParameter){})