2014-11-08 93 views
2

我有这书上的代码工作,我不能让它在PHPUnit 4.3assertAttributeEqual不适用于私有属性

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

你几乎拥有它,你必须将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()是方便 包装使用一个公共的,受保护的,或一个类 或对象作为实际值的私人属性。

我发现它的一些drupal documentation,它指定了它的参数列表。

assertAttributeEquals负责修改由第二个形式参数($actualAttributeName)指定的属性的可见性。

+0

对不起,只是复制和粘贴你的代码,它仍然是一样的错误。 – Zed 2014-11-09 07:52:12

+0

刚刚添加了公共属性,并且错误消息是相同的:“在对象中找不到”属性“xxx”。“ – Zed 2014-11-09 08:50:56