如何从 Stub 访问对象的属性?

How to access properties of object from Stub?

我有简单的class:

class MyClass {

    private $myProperty;

    public __construct($propertyValue) {
        $this->myProperty= $propertyValue;
    }

    public function myMethod() {
        // Something
    }

}

并且 class 使用 MyClass 的内容:

class MySecondClass {

    private $myClass;

    public __construct($myClassInst) {
        $this->myClass = $myClassInst;
    }

    public function doIt() {
        $this->myClass->myMethod();
    }

}

我对一些 MySecondClass 进行了单元测试 class:

use Codeception\TestCase\Test;
use Codeception\Util\Stub;

class MySecondClassTest extends Test

    public function testDoIt() {
        $data = null;

        $myClass = Stub::construct('MyClass', ['propertyValue'], [
            'myMethod' => function() use (&$data) {
                // I want do that, but I can not!
                //$data = $this->myProperty;
            }

        $mySecondClass = new MySecondClass($myClass);
        $mySecondClass->doIt();

        $this->assertEquals($data, 'assertValue');
    ]);

}

如果要取消注释上面示例中的行:

PHP Warning:  Uncaught PHPUnit_Framework_Exception: Undefined variable: myProperty ...

如果 myProperty 是 public:

PHPUnit_Framework_Exception: Undefined property: MySecondClassTest::$myProperty

问题:如果 $this 引用 class MySecondClassTest 的对象,如何从 Stub 访问 MyClass 的 属性 myProperty

亚格尼。您在 MySecondClass::doIt 中测试逻辑,而不是在 MyClass.

您模拟 MyClass,并使用常数值定义来自 MyClass::myMethod 的准确响应。基本上,您的 testDoIt() 读取:鉴于我们有一个 MyClass 的实例,该实例 return 某个精确值,我们期望 MySecondClass::doIt 到 return 某个精确值。而已。与 MyClass::myProperty 完全无关。

编辑 回复评论

In case of public property it is error too, because $this references to MySecondClassTest object: PHPUnit_Framework_Exception: Undefined property: MySecondClassTest::$myProperty

首先,我认为你误解了测试替身的概念。 Stub 不是模拟 class 的实例。这是一个存根。它 模仿 模拟 class 的行为,并且仅在定义的部分。

其次,闭包中的$this总是引用定义闭包的class。在你的情况下是 MySecondClassTest.

同样,问题不在于 属性 的可见性,而在于您在测试中需要此 属性 的值这一事实。你不。它违反了单元测试的核心原则。