zoukankan      html  css  js  c++  java
  • 第三节 需要异常

    执行代码时错误是常见的。 有时候是需要它们的,有时候是不需要他们的。处理意外或不需要的情况的更好方法是使用异常。 理由是你可以通过将代码包装到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( 'UtilMail' );
        $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( 'UtilMail' );
        $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是泛型错误的顶级异常,因此它会验证是否抛出了此异常。 它很方便,但使用异常是一种更好的方法,因为您可以指定异常类型,并且可以验证是否抛出了正确的异常。

  • 相关阅读:
    node.js 安装后怎么打开 node.js 命令框
    thinkPHP5 where多条件查询
    网站title中的图标
    第一次写博客
    Solution to copy paste not working in Remote Desktop
    The operation could not be completed. (Microsoft.Dynamics.BusinessConnectorNet)
    The package failed to load due to error 0xC0011008
    VS2013常用快捷键
    微软Dynamics AX的三层架构
    怎样在TFS(Team Foundation Server)中链接团队项目
  • 原文地址:https://www.cnblogs.com/mysic/p/9442767.html
Copyright © 2011-2022 走看看