assertAttributeEqual不适用于私有属性

时间:2014-11-08 21:35:21

标签: php phpunit

我有这本书中的代码,我无法通过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中只是改变了?

1 个答案:

答案 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)指定的属性的可见性。