在我的测试中,我为一个类创建了一个测试存根,并模拟了该方法的输出" 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($这 - > authMock->认证());出口; //返回0 :(
我确信过去我能做到这一点。除非它是以前版本的PHPUnit。目前我使用的是4.8。*。我能做到这一点吗?默认情况下,我希望authenticate返回FAIL,但有些测试我可能希望用SUCCESS覆盖它(所以就好像用户已经过身份验证一样)
答案 0 :(得分:2)
我记不起能够两次模拟相同的方法,所以我通常做的是定义辅助函数:
protected function mockAuthResult($result = 0) {...}
另一个选择是定义:
protected $authResult;
然后在setUp
:
$this->authResult = 0; // fail by default
$this->authMock
->method('authenticate')
->willReturn($this->authResult);
然后你可以为个别测试覆盖它。