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

问题描述 投票:0回答:4

我目前正在开发一个存储敏感数据的项目,因此必须能够根据请求删除它们。

我想测试我的实体(患者)是否使用空电话号码保存到数据库中。第一个想法是:将参数传递给

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 ?

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

php mocking phpunit
4个回答
35
投票

您可以使用

returnCallback()
对论证做出断言。请记住通过
PHPUnit_Framework_Assert
静态调用断言函数,因为您不能在闭包内使用
self

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

17
投票

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

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
投票

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

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

然后你可以断言它是

NULL


3
投票

有一件事 - 从 PHP 5.4 开始,你仍然可以访问 $this,在这种情况下,它会给你 已接受答案的变体

$this->patientDao
    ->expects($this->once()) 
    ->method('savePatient')
    ->will($this->returnCallback(function($patient) {
        $this->assertNull($patient->getPhoneNumber());
    }));
© www.soinside.com 2019 - 2024. All rights reserved.