加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 13:10:52 所属栏目:PHP教程 来源:网络整理
导读:我正在测试setSubject方法,如果它缺少,则设置为(空主题). 如果尝试访问未声明的属性,Zend_Mail会抛出异常(例如,电子邮件主题丢失,最好抛出一些例外).更多信息: http://framework.zend.com/issues/browse/ZF-11371 这是我需要使用才能成功测试它: 类 protec
我正在测试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(...));
  ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读