12

5.3で名前空間を使用しており、Symfony2フレームワークを使用してPHPUnitで予期される例外をテストしようとしています。

例外がスローされることを期待しています。

$this->setExpectedException('ImageResizerException');

次のエラーが発生します。

PHPUnit 3.7.13 bySebastianBergmann。

/var/www/branches/3.6.0/api/app/phpunit.xml.distから読み取った構成

.E................。

時間:1秒、メモリ:18.25Mb

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

1)AssetManagerBundle \ Tests \ Services \ ImageResizerTest :: testOriginalFile ReflectionException:クラスImageResizerExceptionが存在しません

失敗!テスト:19、アサーション:54、エラー:1。

私は次の構造を持っています:

  1. AssetManagerBundle \ Services \ ImageResizer.php
  2. AssetManagerBundle \ Services \ Exceptions \ ImageResizerException.php
  3. AssetManagerBundle \ Tests \ Services \ ImageResizerTest.php

私のテストクラス:

<?php
    namespace AssetManagerBundle\Tests\Services;

    use AssetManagerBundle\Services\ImageResizer;
    use AssetManagerBundle\Services\Exceptions\ImageResizerException;

class ImageResizerTest extends \PHPUnit_Framework_TestCase
{

    public function testOriginalFile()
    {
        $ir = new ImageResizer();
        // test default value
        $this->assertEquals('', $ir->getOriginalFile());

        // test invalid filename
        $this->setExpectedException('ImageResizerException');
        $ir->setOriginalFile('/tmp/test.file');
        $this->assertEquals('/tmp/test.file', $ir->getOriginalFile());


        // test valid filename
        $temp_name  = tempnam(sys_get_temp_dir(), 'test_'.time());
        $handle     = fopen($temp_name, 'w+');
        fwrite($handle, ' ');
        fclose($handle);

        $ir->setOriginalFile($temp_name);
        $this->assertEquals($temp_name, $ir->getOriginalFile());
    }
    // more code....
}

例外クラスを表示するには、PHPUnitに対して特別なことをする必要がありますか?

PHPバージョン:

PHP 5.3.10-1ubuntu3.5 with Suhosin-Patch(cli)(ビルド:2013年1月18日23:45:59)Copyright(c)1997-2012 PHP Group Zend Engine v2.3.0、Copyright(c)1998-2012 Zend Technologies with Xdebug v2.1.0、Copyright(c)2002-2010、by Derick Rethans

4

5 に答える 5

29

名前空間とともに例外クラスを完全に修飾する必要があります。例:

$this->setExpectedException('\AssetManagerBundle\Services\Exceptions\ImageResizerException');

また

use AssetManagerBundle\Services\Exceptions\ImageResizerException;
$exceptionClass = get_class(new ImageResizerException(''));
$this->setExpectedException($exceptionClass);
于 2013-01-28T22:35:30.550 に答える
5

例外のFQCNを使用する必要があります。ImageResizerException

AssetManagerBundle\Services\Exceptions\ImageResizerException

ファイルのuse先頭にある句は、そのファイル専用です。他のファイルにコードがあるPHPUnit用ではありません。

訂正:useこの句がPHPUnitで機能しないのは(のみ)ではなくReflectionClass、FQCNを想定しているためです。これは、PHPで次のような変数(動的)クラス名を使用する場合にも似ていますnew $var

<?php

namespace Sugar {
    class Exception extends \Exception {}
}
namespace {
    use Sugar\Exception;

    $class = 'Sugar\Exception';
    $e = new $class;
    var_dump($e);
}

出力:

object(Sugar\Exception)#1 (7) {
  ["message":protected]=>
  string(0) ""
  ["string":"Exception":private]=>
  string(0) ""
  ["code":protected]=>
  int(0)
  ["file":protected]=>
  string(45) "/tmp/execpad-7141d0116de7/source-7141d0116de7"
  ["line":protected]=>
  int(10)
  ["trace":"Exception":private]=>
  array(0) {
  }
  ["previous":"Exception":private]=>
  NULL
}

デモ:http ://eval.in/7883

于 2013-01-28T22:37:25.250 に答える
0

クラス名を記述する代わりに、クラスの完全な名前空間を使用してください。その場合、「クラスが存在しません」という例外は発生しません。

于 2016-06-28T02:37:38.000 に答える
0
    $this->setExpectedException(ImageResizerException::class);

useステートメントからインポートされた名前空間を使用してそれを行う方法です

于 2016-06-30T09:08:46.287 に答える
0

同様の問題が発生しましたが、phpunitでは、@ expectedExceptionを宣言する際に、FQCNも必要でした。

 /**
 * @expectedException \PHPNS\Core\MyCustomException
 */
public function testIfListIsEmpty()
{
    $fab = new PHPList();                         
}

それが誰かを助けることを願っています。

于 2016-11-24T03:00:03.593 に答える