可以不覆盖PHPUnit测试存根方法吗?

时间:2016-01-17 00:11:19

标签: php phpunit

在我的测试中,我为一个类创建了一个测试存根,并模拟了该方法的输出" 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覆盖它(所以就好像用户已经过身份验证一样)

1 个答案:

答案 0 :(得分:2)

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

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

另一个选择是定义:

protected $authResult;

然后在setUp

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

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