博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第三节 需要异常
阅读量:4623 次
发布时间:2019-06-09

本文共 2374 字,大约阅读时间需要 7 分钟。

执行代码时错误是常见的。 有时候是需要它们的,有时候是不需要他们的。处理意外或不需要的情况的更好方法是使用异常。 理由是你可以通过将代码包装到try-catch语句中然后选择处理什么的方式从异常中恢复代码执行,不是让它死掉。 在编写测试时,您甚至想要测试这些场景,是的,这是可能的。

1.测试错误和异常

在PHPUnit中,错误处理适用于set_error_handler()和set_exception_handler()函数级别。 这意味着分配一个特殊函数,该函数在发生错误/异常时被调用,并且未在异常处理程序中捕获。

这也是限制。 如果您的代码导致致命错误,脚本将停止执行,并且不会调用错误处理程序。 如果在测试执行期间发生这种情况,则停止测试并且不显示测试结果。 例如,当你的内存不足时,就会发生这种情况,之后代码执行就会消失,就是这样。

如果我们回顾第39和40行的代码,您可以看到以下代码行:

if (!$user->isInputValid())throw new \InvalidArgumentException('Invalid user data');

我们抛出异常,我们没有测试这种情况。 显然,我们应该,但我们如何测试异常呢? 其中一个选项如以下代码段所示:

public function testCreateUserException (){    $db               = new \PDO( 'mysql:host=localhost;port=3306;dbname=test',        'root' );    $config           = new \stdClass();    $config->email    = 'test@example.com';    $config->site_url = 'http://example.com';    $email            = $this->getMock( '\Util\Mail' );    $userManager      = new UserManager( $email, $db, $config );    $user             = new User( array (        'firstName' => 'FirtsName',        'lastName'  => 'LastName', 'email' => null,        'password'  => 'password123'    ) );    try {        $userManager->createUser( $user );        $this->fail();    } catch (\InvalidArgumentException $e) {// correct behavior    }}

这样我们测试了抛出异常。

但是,PHPUnit提供了一种更优雅的方式来测试异常。 您可以使用注释将测试标记为抛出异常的测试,如以下代码段所示:

/** * @expectedException InvalidArgumentException */public function testCreateUserException (){    $db               = new \PDO( 'mysql:host=localhost;port=3306;dbname=test',        'root', '' );    $config           = new \stdClass();    $config->email    = 'test@example.com';    $config->site_url = 'http://example.com';    $user             = new User( array (        'firstName' => 'FirtsName',        'lastName'  => 'LastName', 'email' => null,        'password'  => 'password123'    ) );    $email            = $this->getMock( '\Util\Mail' );    $userManager      = new UserManager( $email, $db, $config );    $userManager->createUser( $user );}

如您所见,没有断言,但是当您运行测试时,您将获得以下结果:

OK (1 test, 1 assertion)

在这种情况下,断言是@expectedException InvalidArgumentException,并抛出异常。 测试异常的另一种方法是调用$ this-> setExpectedException()方法。

要测试错误,您可以使用以下代码行:

/*** @expectedException PHPUnit_Framework_Error*/

由于所有PHP错误都在PHPUnit中转换为异常,并且PHPUnit_Framework_Error是泛型错误的顶级异常,因此它会验证是否抛出了此异常。 它很方便,但使用异常是一种更好的方法,因为您可以指定异常类型,并且可以验证是否抛出了正确的异常。

转载于:https://www.cnblogs.com/mysic/p/9442767.html

你可能感兴趣的文章
JavaScript的闭包
查看>>
NuGet学习笔记(1) 初识NuGet及快速安装使用
查看>>
js实现的几种继承方式
查看>>
javascript飞机大战-----002游戏引擎
查看>>
ajax的访问 WebService 的方法
查看>>
微信内置浏览器如何自动跳转其它浏览器
查看>>
Some Posts about Tree for MVC
查看>>
小程序参数传递
查看>>
初始面向对象
查看>>
在Ubuntu上安装Intellij IDEA并创建桌面快捷方式
查看>>
Spring框架学习之第2节
查看>>
linux的PAM认证和shadow文件中密码的加密方式
查看>>
java 生成订单号
查看>>
网站建设
查看>>
离别 李叔同
查看>>
SqlStoredProc池
查看>>
新手入门之——Ubuntu上的编辑器之神Vi / Vim
查看>>
使用 VS2013 Update 4 编译 NASM 2.11.08
查看>>
LeetCode-Evaluate Reverse Polish Notation (Python)
查看>>
Handlebars.js 模板引擎
查看>>