在我的测试中,我为一个类创建了一个测试存根,并模拟了方法"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);
然后,您可以为单个测试覆盖它。