PHPUnit 测试存根方法是否可以不被覆盖


Can PHPUnit test stub methods not be overwritten?

在我的测试中,我为一个类创建了一个测试存根,并模拟了方法"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);

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

// 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()); exit;//返回 0 :(

敢肯定,在过去我能够做到这一点。除非它是PHPUnit的先前版本。目前我使用的是 4.8.*。我有什么办法可以做到这一点吗?默认情况下,我希望身份验证返回 FAIL,但某些测试我可能希望用 SUCCESS 覆盖它(因此,就好像用户已经过身份验证一样)

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

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

另一种选择是定义:

protected $authResult;

然后在您的setUp中:

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

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