当使用 PHPUnit 模拟对象时,如何访问通常通过重载访问的对象的属性,即通过 __get()
?
例如,在下面的代码中我正在测试 Post 对象。每个帖子都有一个作者,其类型为角色。每个角色都有一个 Signature 属性。
$author = $this->getMockBuilder('App_Model_Domain_Role')
->disableOriginalConstructor()
->getMock();
$author->expects($this->any())
->method('__get')
->will($this->returnValue('authorname'));
如您所见,我模拟了 Role 对象,然后将其配置为在 __get()
时返回字符串('authorname')。叫做。我正在测试的 Post 对象指的是 $this->author->signature
。我期望它返回“authorname”,但测试错误却显示 $signature
是一个未定义的属性。
我尝试按照上面的方式配置模拟,但没有 method()
调用(认为 expects()
和 will()
调用将应用于所有模拟的方法)但仍然没有成功。
有什么想法吗?
此外,如果您知道有关 PHPUnit 模拟的优秀教程,我会很乐意看到它 - 该手册似乎假设您事先具备该特定领域的测试知识。
最佳答案
我尝试了与您相同的代码,它对我有用。我的 PHPUnit 版本是 3.7.12。您使用哪个版本?如果您运行的是旧版本,您可以尝试升级。
public function testMockingMagicGetter()
{
$myMock = $this->getMockBuilder('MyClass')
->disableOriginalConstructor()
->getMock();
$myMock
->expects($this->any())
->method('__get')
->will($this->returnValue('authorname'));
var_dump($myMock->signature);
var_dump($myMock->dummy);
var_dump($myMock->someprop);
}
结果:
string(10) "authorname"
string(10) "authorname"
string(10) "authorname"
关于unit-testing - 如何访问 PHPUnit 模拟对象上的重载属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14825507/