为什么嘲笑returnValue不能在phpunit的tearDown中工作?

时间:2014-08-08 19:43:45

标签: php unit-testing mocking phpunit

在我的测试类的设置中,我为用户创建了一个模拟对象。当模拟创建时,它会执行以下操作:

$other = $this->getMock( 'Other' );

$user->expects( $this->any() )
     ->method( '_getOtherInstance' )
     ->will( $this->returnValue( $other ) );

现在在删除用户时,它会调用_getOtherInstance来删除第三级信息。

当我在我的测试课中运行删除时#39;在tearDown之前parent::tearDown_getOtherInstance会返回null

我知道模拟设置正确,因为在delete中运行setUp有效。

这里有什么关于tearDown的特别之处?我会想象PHPUnit会取消所有模拟和它们返回的内容,但是在我用parent::tearDown调用链之前不会。

1 个答案:

答案 0 :(得分:0)

setUp中的tearDownTestCase都是空的,您不需要在测试中打扰它们。它们是您单独使用的模板方法。这同样适用于静态版本。

调用上述方法的方法是runBare,并且在调用verifyMockObjects之前调用tearDown 。此方法在每个模拟上调用__phpunit_verify,然后验证期望,然后删除

public function __phpunit_verify() {
    $this->__phpunit_getInvocationMocker()->verify();
    $this->__phpunit_invocationMocker = NULL;
}

将模拟对象转储到tearDown中,表明包含期望的调用模拟器已设置为null,使其无法用于tearDown方法。

  

危险:如果您确实必须达到预期效果,您可以在测试用例中覆盖verifyMockObjects,因为它是受保护的方法。抓住你需要的东西,然后调用父方法。请记住,您在PHPUnit内部进行了非常频繁的更改。