我有这本书中的代码,我无法通过PHPUnit 4.3传递它
class Foo {
protected $message;
protected function bar($environment) {
$this->message = "PROTECTED BAR";
if($environment == 'dev') {
$this->message = 'CANDY BAR';
}
}
}
class FooTest extends PHPUnit_Framework_TestCase {
public function testProtectedBar() {
$expectedMessage = 'PROTECTED BAR';
$reflectedFoo = new ReflectionMethod('Foo', 'bar');
$reflectedFoo->setAccessible(true);
$reflectedFoo->invoke(new Foo(), 'production');
$this->assertAttributeEquals(
$expectedMessage,
'message',
$reflectedFoo,
'Did not get expected message'
);
}
}
运行PHPUnit之后,我得到'PHPUnit_Framework_Exception: Attribute "message" not found in object.'
这很奇怪,或者说API在4.3中只是改变了?
答案 0 :(得分:1)
你几乎拥有它,你必须将Foo的实例传递给assertAttributeEquals
而不是ReflectionMethod
类的实例。
class FooTest extends PHPUnit_Framework_TestCase {
public function testProtectedBar() {
$expectedMessage = 'PROTECTED BAR';
$reflectedFoo = new ReflectionMethod('Foo', 'bar');
$reflectedFoo->setAccessible(true);
$foo = new Foo();
$reflectedFoo->invoke($foo, 'production');
$this->assertAttributeEquals(
$expectedMessage,
'message',
$foo,
'Did not get expected message'
);
}
}
我无法在PHPUnit的官方4.3文档中找到关于assertAttributeEquals
的正确文档,只是对它的引用here。
assertAttributeEquals()和assertAttributeNotEquals()很方便 使用类的public,protected或private属性的包装器 或对象作为实际值。
我发现了一些drupal documentation,它指定了参数列表。
assertAttributeEquals
负责修改第二个形式参数($actualAttributeName
)指定的属性的可见性。