PHPUnit断言抛出异常?

有谁知道是否有assert或类似的东西可以测试是否在被测试的代码中抛出异常?


<?php
require_once 'PHPUnit/Framework.php';

class ExceptionTest extends PHPUnit_Framework_TestCase
{
    public function testException()
    {
        $this->expectException(InvalidArgumentException::class);
        // or for PHPUnit < 5.2
        // $this->setExpectedException(InvalidArgumentException::class);

        //...and then add your test code that generates the exception 
        exampleMethod($anInvalidArgument);
    }
}

expectException()PHPUnit文档

PHPUnit的作者文章提供了关于测试异常最佳实践的详细解释。


您也可以使用docblock注释:

class ExceptionTest extends PHPUnit_Framework_TestCase
{
    /**
     * @expectedException InvalidArgumentException
     */
    public function testException()
    {
        ...
    }
}

对于PHP 5.5+(特别是带有名称空间的代码),我现在更喜欢使用::class


如果您使用的是PHP 5.5或setExpectedException ,则可以使用::class resolution通过expectException / setExpectedException获取::class的名称。 这提供了几个好处:

  • 该名称将完全限定其名称空间(如果有的话)。
  • 它解析为一个string因此它可以与任何版本的PHPUnit一起使用。
  • 您可以在IDE中完成代码完成。
  • 如果您错误输入了类名称,PHP编译器会发出错误。
  • 例:

    namespace MyCoolPackage;
    
    class AuthTest extends PHPUnit_Framework_TestCase
    {
        public function testLoginFailsForWrongPassword()
        {
            $this->expectException(WrongPasswordException::class);
            Auth::login('Bob', 'wrong');
        }
    }
    

    PHP编译

    WrongPasswordException::class
    

    "MyCoolPackageWrongPasswordException"
    

    没有PHPUnit是明智的。

    :PHPUnit的5.2推出expectException作为替代setExpectedException

    链接地址: http://www.djcxy.com/p/81711.html

    上一篇: PHPUnit assert that an exception was thrown?

    下一篇: differences between 2 JUnit Assert classes