【问题标题】:Can PHPUnit test stub methods not be overwritten?PHPUnit 测试存根方法不能被覆盖吗?
【发布时间】:2016-01-17 08:49:58
【问题描述】:

在我的测试中,我为一个类创建了一个测试存根,并模拟了“save”方法的输出以返回一个默认值。在每次测试运行之前,我的 setUp() 方法中有这个:

//  auth adapter
$this->authMock = $this->getMockBuilder('App\\Auth')
    ->disableOriginalConstructor()
    ->getMock();

// by defaut, we'll make authenticate return a FAIL result
$this->authMock
    ->method('authenticate')
    ->willReturn(0);

然后将其注入到我的服务定位器中,覆盖应用程序使用的服务定位器(真正的 App\Auth)。但是,在实际测试过程中,我可能希望更改该方法的输出

// here, we'll make authenticate return a SUCCESS result
$this->authMock
    ->method('authenticate')
    ->willReturn(1);

无论如何,一旦我发现了问题,对于 POC,我只是将这些一个接一个地放在一起,而且似乎 PHPUnit 不允许我覆盖之前声明的模拟方法返回值:

//  auth adapter
$this->authMock = $this->getMockBuilder('App\\Auth')
    ->disableOriginalConstructor()
    ->getMock();

// by defaut, we'll make authenticate return a FAIL result
$this->authMock
    ->method('authenticate')
    ->willReturn(0);

// here, we'll make authenticate return a SUCCESS result
$this->authMock
    ->method('authenticate')
    ->willReturn(1);

var_dump($this->authMock->authenticate());出口; // 返回 0 :(

我确信过去我能够做到这一点。除非它是以前版本的 PHPUnit。目前我正在使用 4.8.*。我有什么办法可以做到这一点?默认情况下,我希望通过身份验证返回 FAIL,但有些测试我可能想用 SUCCESS 覆盖它(所以就像用户通过身份验证一样)

【问题讨论】:

    标签: php phpunit


    【解决方案1】:

    我不记得曾经两次模拟同一个方法,所以我通常做的是定义一个辅助函数:

    protected function mockAuthResult($result = 0) {...}
    

    另一种选择是定义:

    protected $authResult;
    

    然后在你的setUp:

    $this->authResult = 0; // fail by default
    $this->authMock
        ->method('authenticate')
        ->willReturn($this->authResult);
    

    然后您可以为个别测试覆盖它。

    【讨论】:

    • 实际上,我真正的 authResult(不是我给出的整数示例)是一个对象,因此将通过引用传递,所以这种方法对我有用。我不确定 willReturn 方法的参数是否通过引用传递,所以整数在这里可以工作吗?无论如何,谢谢你的建议。我也有这种想法,但希望我不需要它。 phpunit 是否有任何理由不允许重新定义模拟方法?也许我可以在他们的 github 页面上提出来。
    • 现在我想起来了,它可能不是通过引用传递的,所以你可能需要将它包装在一个闭包中并使用willReturnCallback
    • 哦,我以前从未使用过这种方法。谢谢,看起来很有用。
    猜你喜欢
    • 2015-04-09
    • 2020-02-11
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    相关资源
    最近更新 更多