【问题标题】:Why would mocked returnValue not work in tearDown of phpunit?为什么模拟的 returnValue 在 phpunit 的拆解中不起作用?
【发布时间】:2014-08-08 19:43:44
【问题描述】:

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

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

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

现在在删除用户时,调用_getOtherInstance删除三级信息。

当我在我的测试类'tearDown 中运行删除时,parent::tearDown 之前,_getOtherInstance 返回null

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

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

【问题讨论】:

  • 您应该展示您在setUp、测试本身和tearDown 中的代码(或示例代码)。您可能根本不应该进行任何拆解。

标签: php unit-testing mocking phpunit


【解决方案1】:

setUptearDownTestCase 中都是空的,您无需在测试中调用它们。它们是供您单独使用的模板方法。这同样适用于静态版本。

调用上面的方法和你的测试方法是runBare,它调用verifyMockObjects之前调用tearDown。这个方法在每个模拟上调用__phpunit_verify,然后验证期望,然后删除它们:

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

将模拟对象转储到tearDown 表明包含期望的调用模拟程序已设置为null,从而使您的tearDown 方法无法使用它们。

危险:如果你真的必须达到预期,你可以在你的测试用例中覆盖verifyMockObjects,因为它是一个受保护的方法。抓住你需要的,然后调用父方法。请记住,您正在处理频繁更改的 PHPUnit 内部结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2012-08-21
    • 1970-01-01
    • 2011-07-24
    • 2015-03-15
    • 2013-09-03
    • 2011-07-12
    相关资源
    最近更新 更多