【问题标题】:PHPUnit cannot find exception classPHPUnit 找不到异常类
【发布时间】:2013-01-12 09:46:40
【问题描述】:

我在 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\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 版本:

带有 Suhosin-Patch (cli) 的 PHP 5.3.10-1ubuntu3.5(构建时间: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

【问题讨论】:

    标签: php unit-testing symfony namespaces phpunit


    【解决方案1】:

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

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

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

    【讨论】:

    • 他已经用过第二种方案了,还是不行。但是第一个解决方案可以。
    • @RezaSanaie 出于某种原因,第二个例子不起作用,但第一个例子起作用
    • 我能明白为什么我必须在$this-&gt;setExpectedException() 调用中使用 FQCN 的唯一原因是此方法是在 PHPUnit_Framework_TestCase 类中定义的,因此无法从该类访问 use 调用.
    • @Patrick:不,无论何时创建字符串,使用类都无关紧要——即使在同一个文件中也是如此。查看演示,根据需要更改:eval.in/7883(但我必须批评我自己的,因为我也先做出了解释)
    • 我现在还用工作版本更新了第二个示例(但未经测试,但它可能只是让更多人看到它是如何工作的)。
    【解决方案2】:

    需要使用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

    【讨论】:

      【解决方案3】:

      不要写类名,而是使用类的完整命名空间。那么你将不会得到“类不存在”异常。

      【讨论】:

        【解决方案4】:
            $this->setExpectedException(ImageResizerException::class);
        

        是使用use 语句中导入的命名空间的方法

        【讨论】:

          【解决方案5】:

          我也遇到过类似的问题,但是对于 phpunit,在声明 @expectedException 的同时,它还需要 FQCN。

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

          希望对某人有所帮助。

          【讨论】:

            猜你喜欢
            • 2013-07-18
            • 2013-11-30
            • 2019-07-22
            • 2017-06-29
            • 1970-01-01
            • 1970-01-01
            • 2023-03-27
            • 2012-04-28
            • 2017-02-24
            相关资源
            最近更新 更多