【问题标题】:yii phpunit getMockBuilder not working with --filteryii phpunit getMockBuilder 不使用--filter
【发布时间】:2014-11-30 18:17:24
【问题描述】:

在一个 Yii 项目中,我使用 phpunit 和 getMockbuilder。当我对整个文件运行单元测试时,它们都通过了。但是,当我执行phpunit --filter testMyFunction 时,出现以下错误。 "调用未定义的方法 Mock_Account_3a811374::__construct() ..."

在做了更多检查后,我发现如果 --filter 最终包含一个不使用模拟的测试,那么它工作正常。

有人对如何修复它有任何想法吗?

这是我的一些代码(简化)...

use components\Account;

class UtilsTest extends CDbTestCase
{
    ...
    public function testMyFunction()
    {
        $accountStub = $this->getMockBuilder('Account')
            ->disableOriginalConstructor()
            ->setMethods(array('methodToStub'))
            ->getMock();

        $accountStub->expects($this->any())
            ->method('methodToStub')
            ->will($this->returnValue(false));

        $accountStub->__construct();
    ...
    }
}

【问题讨论】:

  • 会不会是因为您使用模拟构建器禁用了原始构造函数?这就是为什么它在您测试整个文件时起作用的原因......?
  • @AresDraguna,我认为它应该可以工作。我需要能够禁用原始构造函数并稍后调用它。
  • 嗯,$this->betMockBuilder('Account') 我觉得应该是 $this->getMockBuilder('Account') 如果你想使用 __construct 你也应该模拟它。
  • @Jhn,我不确定你的意思。我如何使用 __construct 并模拟它?我要么嘲笑它,要么使用它,对吧?我的测试需要能够调用真正的 __construct 函数。它们在调用整个测试类时工作正常,但在使用 --filter testMyFunction 仅调用一个测试函数时会死机

标签: php yii mocking phpunit


【解决方案1】:

当您指定不想使用 ->disableOriginalConstructor() 调用原始构造函数时,我对尝试使用 $accountStub->__construct() 做什么感到困惑?

您可以自己调用构造函数并使用setConstructorArgs(array $args) 传递参数。所以这看起来像这样:

$accountStub = $this->getMockBuilder('Account')
        ->setConstructorArgs($args)
        ->getMock();

但是,将其与 disableOriginalConstructor() 同时调用是没有意义的。我想你可能想做一个或另一个。

我相信您收到的错误消息只是 PHP 告诉您您正在尝试做一些没有意义的事情。您正在尝试在已构造的对象上调用构造函数。更重要的是,您甚至专门告诉 mock 跳过对构造函数方法的调用。 PHP 只是告诉你这个方法不存在。

我认为您可能只需要删除以下行并再次测试:

$accountStub->__construct();

【讨论】:

  • 如果我没记错的话,使用disableOriginalConstructor 的想法是避免在getMock() 调用上调用构造函数。它需要等到expects 节之后才被调用。正如我上面提到的,当调用整个测试类时测试工作正常,但是当使用 --filter testMyFunction 只调用一个测试函数时会死机
  • 我明白了,感谢您的澄清。你能分享其他测试的任何代码吗?听起来好像在先前的测试之一中正在执行某些操作,导致上述测试在按顺序运行时通过。在测试之间的设置/拆卸中未清除的某种状态。如果没有看到完整的代码以及其他测试中发生的情况,很难猜测该状态可能是什么。
猜你喜欢
  • 2013-10-29
  • 1970-01-01
  • 2014-06-09
  • 2016-04-16
  • 2014-01-11
  • 2012-09-03
  • 2013-12-28
  • 2023-03-14
  • 2012-10-09
相关资源
最近更新 更多