我在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。
我有以下结构:
我的测试班:
<?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
答案 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
}
答案 2 :(得分:0)
而不是编写类名,而是使用类的完整命名空间。那么你就不会得到“阶级不存在”的例外。
答案 3 :(得分:0)
$this->setExpectedException(ImageResizerException::class);
是使用use
语句
答案 4 :(得分:0)
我遇到了类似的问题,但是使用phpunit,在声明@expectedException时,它还需要FQCN。
/**
* @expectedException \PHPNS\Core\MyCustomException
*/
public function testIfListIsEmpty()
{
$fab = new PHPList();
}
希望能有所帮助。