如何从 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
.
同样,问题不在于 属性 的可见性,而在于您在测试中需要此 属性 的值这一事实。你不。它违反了单元测试的核心原则。
我有简单的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
.
同样,问题不在于 属性 的可见性,而在于您在测试中需要此 属性 的值这一事实。你不。它违反了单元测试的核心原则。