如何使用Phpunit代理原始方法并同时禁用构造函数?

时间:2014-09-25 12:43:11

标签: php phpunit

使用Phpunit 4.5.2,我正在尝试模拟以下类:

class Foo {
    public function bar() {}
}

class MyClass
{
    private $foo;

    public function __construct(Foo $foo) {
        $this->foo = $foo;
        //some other stuff that I want to suppress during the unit tests.
    }

    public function doSomething() {
        $this->foo->bar();
    }
}

我希望实现以下目标:

  1. 让模拟调用原始方法。
  2. 避免使用构造函数(我使用反射设置 foo 属性)。
  3. 此代码:

    $mock = $this->getMockBuilder('MyClass')
                 ->disableOriginalConstructor()
                 ->enableProxyingToOriginalMethods()
                 ->getMock()
    

    将失败并显示以下错误消息:

      

    传递给MyClass :: __ construct()的参数1必须是Foo的一个实例,没有给出

    如果我删除 enableProxyingToOriginalMethods(),则创建的模拟没有错误,所以当我启用代理时,这启用了构造函数,尽管 disableOriginalConstructor()调用

    如何在保持构造函数禁用的同时启用代理?

1 个答案:

答案 0 :(得分:7)

如果您代理原始类,则必须实例化原始类的对象。如果原始类具有构造函数,则必须执行该构造函数。因此,disableOriginalConstructor()和enableProxyingToOriginalMethods()是互斥的。

随意在https://github.com/sebastianbergmann/phpunit-mock-objects/issues打开一张票,要求PHPUnit在这两个一起使用时发出错误。