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

Dej*_*vic 8 php phpunit zend-framework object try-catch

如果缺少的话,我正在测试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)';
}
Run Code Online (Sandbox Code Playgroud)

测试

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

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

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

测试失败并显示消息:

有1个错误:

1)Email_ParseTest :: testNoSubject InvalidArgumentException:subject是必需的

它抱怨$ this-> subject没有设置(或类似).

更多信息:

  • PHP 5.4.8
  • Zend Framework 1.9.5
  • PHPUnit 3.6.12
  • subject被定义为空字符串("")

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

Ben*_*min 1

看起来您捕获了错误的异常:Zend_Mail 似乎抛出了InvalidArgumentException,而您正在捕获Zend_Mail_Exception.

尝试以下代码:

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 (InvalidArgumentException $e) {
        $this->subject = '(empty subject)';
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

再次阅读你的问题,我想说这Zend_Mail_Exception永远不会被抛出。如果您从第一段代码中删除try/ ,我敢打赌它也会起作用:catch

protected function setSubject()
{
    $this->subject = $this->defunctTheContent($this->message->getHeaders(), $this->message->subject);
    if (! $this->subject) {
        $this->subject = '(empty subject)';
    }
}
Run Code Online (Sandbox Code Playgroud)

第 396 行引用了一个不存在的标头,但看起来即使为$this->subject空也不会触发它(异常类和消息与您的测试结果不匹配)。我怀疑此标头之前已在 Zend 或其他地方设置为空值。

这可以解释为什么在第二种情况下$this->subject永远不会设置(catch代码永远不会执行)。可能InvalidArgumentException是由parseEmail类抛出的,该类检测subject到未设置。

然而,第二个块确实无条件地检查! $this->subject,并相应地设置它。所以测试通过了。

总结一下:

  • Zend_Mail_Exception永远不会被抛出
  • InvalidArgumentException被扔进去parseEmail