我目前正在开发一个存储敏感数据的项目,因此必须能够根据请求删除它们。
我想测试我的实体(患者)是否使用空电话号码保存到数据库中。第一个想法是:将参数传递给
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 ?
我该如何做到这一点,或者是否有其他方法可以确保使用空电话号码保存患者?
您可以使用
returnCallback()
对论证做出断言。请记住通过 PHPUnit_Framework_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->patientDao // This is my mock
->expects($this->once())
->method('savePatient') // savePatient() must be called once
->with($this->returnArgument(0));
然后你可以断言它是
NULL
。
有一件事 - 从 PHP 5.4 开始,你仍然可以访问 $this,在这种情况下,它会给你 已接受答案的变体:
$this->patientDao
->expects($this->once())
->method('savePatient')
->will($this->returnCallback(function($patient) {
$this->assertNull($patient->getPhoneNumber());
}));