PHPUnit找不到异常类

时间:2013-01-28 22:32:21

标签: php unit-testing symfony namespaces phpunit

我在5.3中使用命名空间并尝试使用Symfony2框架在PHPUnit中测试预期的异常。

我期待抛出异常,当我使用

$this->setExpectedException('ImageResizerException');

我收到以下错误:

  

Sebastian Bergmann的PHPUnit 3.7.13。

     

从中读取配置   /var/www/branches/3.6.0/api/app/phpunit.xml.dist

     

.E .................

     

时间:1秒,记忆:18.25Mb

     

有1个错误:

     

1)   AssetManagerBundle \测试\ SERVICES \ ImageResizerTest :: testOriginalFile   ReflectionException:类ImageResizerException不存在

     

FAILURES!测试:19,断言:54,错误:1。

我有以下结构:

  1. AssetManagerBundle \服务\ ImageResizer.php
  2. AssetManagerBundle \服务\例外\ ImageResizerException.php
  3. AssetManagerBundle \测试\服务\ ImageResizerTest.php
  4. 我的测试班:

    <?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与Suhosin-Patch(cli)(内置:2013年1月18日   23:45:59)版权所有(c)1997-2012 PHP Group Zend Engine v2.3.0,   版权所有(c)1998-2012 Zend Technologies       与Xdebug v2.1.0,版权所有(c)2002-2010,作者Derick Rethans

5 个答案:

答案 0 :(得分:27)

您需要完全限定异常类及其名称空间。例如:

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

use AssetManagerBundle\Services\Exceptions\ImageResizerException;
$exceptionClass = get_class(new ImageResizerException(''));
$this->setExpectedException($exceptionClass);

答案 1 :(得分:5)

您需要使用ImageResizerException例外的FQCN

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

答案 2 :(得分:0)

而不是编写类名,而是使用类的完整命名空间。那么你就不会得到“阶级不存在”的例外。

答案 3 :(得分:0)

    $this->setExpectedException(ImageResizerException::class);

是使用use语句

中导入的命名空间的方法

答案 4 :(得分:0)

我遇到了类似的问题,但是使用phpunit,在声明@expectedException时,它还需要FQCN。

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

希望能有所帮助。