8

欠落している場合に(空の件名)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)';
    }
}

テストは次のメッセージで失敗します:

1 件のエラーがありました:

1) Email_ParseTest::testNoSubject InvalidArgumentException: 件名が必要です

$this->subject が設定されていない (または同様の) と文句を言います。

いくつかの詳細情報:

  • PHP5.4.8
  • Zend フレームワーク 1.9.5
  • PHPユニット 3.6.12
  • subject""空文字列 ( )として定義されます

2番目の方法を「手動で」テストしましたが、期待どおりに機能しています(件名はcatchブロック内に設定されています)。私はPHPUnitの経験があまりないので、これはE_PEBKAC簡単かもしれません。

4

2 に答える 2

3

私があなたの質問を誤解していない限り、あなたは保護されたメソッドをテストしようとしています...この方法ではできません。保護されたプライベート メソッドは、それらを使用するパブリック メソッドをテストすることによってテストされると想定されています。

PHPUnit で PHP 5.3.2+ を使用している場合は、テストを実行する前に、リフレクションを使用してそれらをパブリックに設定することにより、プライベート メソッドと保護されたメソッドを直接テストできますが、前述したように、公開メソッドをテストします。

ただし、リフレクションを使用する場合は、一般的な例を次に示します。

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(...));
  ...
}
于 2012-12-22T16:07:59.500 に答える
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)';
    }
}

編集

あなたの質問をもう一度読んで、それ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)';
    }
}

行 396は存在しないヘッダーを参照していますが、空の場合でもトリガーされていないよう$this->subjectです (例外クラスとメッセージがテスト結果と一致しません)。このヘッダーは以前、Zend または他の場所で空の値に設定されていたのではないかと思います。

$this->subjectこれにより、2 番目のケースでが設定されない (catchコードが実行されない)理由が説明されます。はInvalidArgumentExceptionおそらくparseEmailクラスによってスローされ、subject設定されていないことが検出されます。

ただし、2 番目のブロックは無条件に をチェックし! $this->subject、それに応じて設定します。したがって、テストはパスします。

要約する:

  • Zend_Mail_Exception投げられることはありません
  • InvalidArgumentException投げ込まれるparseEmail
于 2012-12-04T11:22:42.733 に答える