在catch块中设置对象属性时,PHPUnit测试失败

前端之家收集整理的这篇文章主要介绍了在catch块中设置对象属性时,PHPUnit测试失败前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在测试setSubject方法,如果它缺少,则设置为(空主题).
如果尝试访问未声明的属性,Zend_Mail会抛出异常(例如,电子邮件主题丢失,最好抛出一些例外).更多信息: http://framework.zend.com/issues/browse/ZF-11371
这是我需要使用才能成功测试它:

protected function setSubject()
{
    # catch exception thrown if non existing $this->message object property is accessed
    try
    {
      $this->subject = $this->defunctTheContent($this->message->getHeaders(),$this->message->subject);
    }
    catch (Zend_Mail_Exception $e)
    {
    }
    if( ! $this->subject)
      $this->subject = '(empty subject)';
}

测试

public function testNoSubject()
{
  $email = new parseEmail(file_get_contents('mail.x'));
  $this->AssertEquals('(empty subject)',$email->subject);
}

但是,如果我尝试使用此代码,您可以看到catch块为空…

protected function setSubject()
{
    try
    {
      $this->subject = $this->defunctTheContent($this->message->getHeaders(),$this->message->subject);
    }
    catch (Zend_Mail_Exception $e)
    {
      $this->subject = '(empty subject)';
    }
}

测试失败并显示消息:

There was 1 error:

1) Email_ParseTest::testNoSubject
InvalidArgumentException: subject is required

它抱怨$this->主题未设置(或类似).

更多信息:

> PHP 5.4.8
> Zend Framework 1.9.5
> PHPUnit 3.6.12
> subject被定义为空字符串(“”)

我已经“手动”测试了第二种方法,它按预期工作(主题在catch块中设置).我对PHPUnit没有多少经验,所以这可能很容易就是E_PEBKAC.

除非我误解你的问题,否则你试图测试受保护的方法……你不能这样做.假设通过测试使用它们的公共方法来测试受保护和私有方法.

如果您将PHP 5.3.2与PHPUnit一起使用,则可以在运行测试之前使用反射将它们设置为公共,从而直接测试私有和受保护的方法,但是,正如我所提到的,您可能需要测试公共方法.

但是如果你想使用反射,这是一个通用的例子:

protected static function getMethod($name) {
  $class = new ReflectionClass('MyClass');
  $method = $class->getMethod($name);
  $method->setAccessible(true);
  return $method;
}

public function testFoo() {
  $foo = self::getMethod('foo');
  $obj = new MyClass();
  $foo->invokeArgs($obj,array(...));
  ...
}
原文链接:/php/136605.html

猜你在找的PHP相关文章