unit-testing - 如何访问 PHPUnit 模拟对象上的重载属性?

标签 unit-testing mocking phpunit

当使用 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/

相关文章:

c# - xunit 是否有参数化测试夹具?

ios - 什么时候使用 specta 的 'sharedExamplesFor' ?

unit-testing - grails 没有找到 geb 功能测试

c# - .NET 中的 Mongodb 单元测试

unit-testing - 包中的模拟方法

php - 我如何在 PHP 中重新创建我的数据库(例如用于单元测试)

php - 如何在单元测试(PHPUnit)中的 trigger_error(..., E_USER_WARNING) 之后执行代码?

unit-testing - 如何在 Visual Studio 2005 中进行单元测试?

dependency-injection - 在 HttpHandler 中使用 IoC 进行构造函数/ setter 注入(inject),这可能吗?

php - 如何测试具有模拟名称类参数的方法