php - 为什么 PHPUnit “接收”一个 Error 对象而不是 Exception 对象
问题描述
当我使用expectExceptionMessage('exception message') 测试一个引发异常的构造函数时,测试失败并且实际的消息文本以“Class 'namespace\Class_Name'”为前缀。
它还指出抛出了 Error 类型的异常,而不是预期的 Exception 类型。
我是否错误地抛出了异常?
通过省略 expectExceptionMessage 函数并将代码包含在 try catch 语句中,我能够使测试通过。这对我来说没有意义。
使用注释
/**
* @expectedException Exception
* @expectedExceptionMessage no_file.json not found
*/
也没有解决问题。
PHPUnit测试代码:
public function testNonExistingFileInConstructor() {
$this->expectException( 'Exception' );
$this->expectExceptionMessage( 'no_file.json not found');
new Json_File('no_file.json');
}
抛出异常的代码:
public function __construct( $path_to_file ) {
$json_file = file_get_contents( $path_to_file );
if( false === $json_file ) {
throw new Exception( $json_file . ' not found', 500 );
}
$data = json_decode( $json_file, true );
if ( is_null( $data) ) {
throw new Exception( 'invalid json in ' . $json_file, 600 );
}
$this->data = $data;
}
解决方案
不要使用注释来预期异常。
始终使用完全限定的类名expectException()
,例如,$this->expectException(YourNamespace\Exception::class);
而不是$this->expectException('Exception');
. 'Exception' 只是一个字符串,无法解析为您期望的异常的正确、完全限定的名称。
推荐阅读
- harmon.ie - Outlook 2016 Harmon.ie Sharepoint 同步已禁用
- angular - 如何在条件下继续 Observable 链
- sinch - 当没有更多积分时不允许用户拨打电话:Sinch Javascript SDK
- c# - 为什么我们需要反射?
- linux - 为什么在 shell 中使用“echo”时我的部分字符串会消失?
- alfresco - 此用例的 activiti 图中是否需要子流程?
- javascript - 用 innerHTML 替换 HTML - Javascript
- express - 错误处理程序如何工作?
- python - 关键字参数默认值可以参数化吗?
- django - 如何在 Django 的 get_queryset() 中返回查询集