PHPUnit断言是否引发了异常?

如何解决PHPUnit断言是否引发了异常?

| 有谁知道是否有一个“ 0”或类似的东西可以测试被测代码中是否抛出了异常?     

解决方法

<?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+上运行,则可以使用
::class
解析度来获取带有
expectException
/
setExpectedException
的类的名称。这提供了几个好处: 该名称将带有其名称空间(如果有)完全限定。 它解析为“ 7”,因此可以与任何版本的PHPUnit一起使用。 您将在IDE中获得代码完成功能。 如果您键入错误的类名,PHP编译器将发出错误。 例:
namespace \\My\\Cool\\Package;

class AuthTest extends \\PHPUnit_Framework_TestCase
{
    public function testLoginFailsForWrongPassword()
    {
        $this->expectException(WrongPasswordException::class);
        Auth::login(\'Bob\',\'wrong\');
    }
}
PHP编译
WrongPasswordException::class
进入
\"\\My\\Cool\\Package\\WrongPasswordException\"
没有PHPUnit是更明智的选择。   注意:PHPUnit 5.2引入了ѭ5来代替
setExpectedException
。     ,下面的代码将测试异常消息和异常代码。 重要说明:如果也未引发预期的异常,它将失败。
try{
    $test->methodWhichWillThrowException();//if this method not throw exception it must be fail too.
    $this->fail(\"Expected exception 1162011 not thrown\");
}catch(MySpecificException $e){ //Not catching a generic Exception or the fail function is also catched
    $this->assertEquals(1162011,$e->getCode());
    $this->assertEquals(\"Exception Message\",$e->getMessage());
}
    ,您可以使用assertException扩展在一个测试执行期间声明一个以上的异常。 将方法插入TestCase并使用:
public function testSomething()
{
    $test = function() {
        // some code that has to throw an exception
    };
    $this->assertException( $test,\'InvalidArgumentException\',100,\'expected message\' );
}
我还为喜欢精美代码的爱好者们赋予了一个特质。     ,一种替代方法可以是以下方法:
$this->expectException(\\InvalidArgumentException::class);
$this->expectExceptionMessage(\'Expected Exception Message\');
请确保您的测试课程范围为
\\PHPUnit_Framework_TestCase
。     ,PHPUnit的“ 5”方法非常不便,因为每个测试方法只能测试一个异常。 我已经使这个辅助函数断言某些函数抛出异常:
/**
 * Asserts that the given callback throws the given exception.
 *
 * @param string $expectClass The name of the expected exception class
 * @param callable $callback A callback which should throw the exception
 */
protected function assertException(string $expectClass,callable $callback)
{
    try {
        $callback();
    } catch (\\Throwable $exception) {
        $this->assertInstanceOf($expectClass,$exception,\'An invalid exception was thrown\');
        return;
    }

    $this->fail(\'No exception was thrown\');
}
将其添加到您的测试班级,并以这种方式调用:
public function testSomething() {
    $this->assertException(\\PDOException::class,function() {
        new \\PDO(\'bad:param\');
    });
    $this->assertException(\\PDOException::class,function() {
        new \\PDO(\'foo:bar\');
    });
}
    ,
public function testException() {
    try {
        $this->methodThatThrowsException();
        $this->fail(\"Expected Exception has not been raised.\");
    } catch (Exception $ex) {
        $this->assertEquals($ex->getMessage(),\"Exception message\");
    }

}
    ,综合解决方案 PHPUnit \当前用于例外测试的“最佳实践”似乎..缺乏光泽(文档)。 因为我想要的不仅仅是当前的“ 5”实现,所以我在测试用例中使用了一个特质。大约只有50行代码。 支持每个测试多个异常 支持引发异常后调用的断言 稳健而清晰的用法示例 标准
assert
语法 支持断言,而不仅仅是消息,代码和类 支持反断言,
assertNotThrows
支持PHP 7
Throwable
错误 图书馆 我向Github和packagist发布了ѭ25特征,以便可以在作曲家中安装它。 简单的例子 只是为了说明语法背后的精神:
<?php

// Using simple callback
$this->assertThrows(MyException::class,[$obj,\'doSomethingBad\']);

// Using anonymous function
$this->assertThrows(MyException::class,function() use ($obj) {
    $obj->doSomethingBad();
});
挺整洁的? 完整用法示例 请参阅下面的更全面的用法示例:
<?php

declare(strict_types=1);

use Jchook\\AssertThrows\\AssertThrows;
use PHPUnit\\Framework\\TestCase;

// These are just for illustration
use MyNamespace\\MyException;
use MyNamespace\\MyObject;

final class MyTest extends TestCase
{
    use AssertThrows; // <--- adds the assertThrows method

    public function testMyObject()
    {
        $obj = new MyObject();

        // Test a basic exception is thrown
        $this->assertThrows(MyException::class,function() use ($obj) {
            $obj->doSomethingBad();
        });

        // Test custom aspects of a custom extension class
        $this->assertThrows(MyException::class,function() use ($obj) {
                $obj->doSomethingBad();
            },function($exception) {
                $this->assertEquals(\'Expected value\',$exception->getCustomThing());
                $this->assertEquals(123,$exception->getCode());
            }
        );

        // Test that a specific exception is NOT thrown
        $this->assertNotThrows(MyException::class,function() use ($obj) {
            $obj->doSomethingGood();
        });
    }
}

?>
    ,您可以执行以下所有异常断言。请注意,所有这些都是可选的。
class ExceptionTest extends PHPUnit_Framework_TestCase
{
    public function testException()
    {
        // make your exception assertions
        $this->expectException(InvalidArgumentException::class);
        // if you use namespaces:
        // $this->expectException(\'\\Namespace\\MyExceptio‌​n\');
        $this->expectExceptionMessage(\'message\');
        $this->expectExceptionMessageRegExp(\'/essage$/\');
        $this->expectExceptionCode(123);
        // code that throws an exception
        throw new InvalidArgumentException(\'message\',123);
   }

   public function testAnotherException()
   {
        // repeat as needed
        $this->expectException(Exception::class);
        throw new Exception(\'Oh no!\');
    }
}
文档可以在这里找到。     ,
/**
 * @expectedException Exception
 * @expectedExceptionMessage Amount has to be bigger then 0!
 */
public function testDepositNegative()
{
    $this->account->deposit(-7);
}
小心
\"/**\"
,注意双“ *”。只写\“ ** \”(星号)将使您的代码失败。 还要确保您使用的是最新版本的phpUnit。在phpunit的某些早期版本中,@expectedException不支持异常。我有4.0,但对我来说不起作用,我必须更新到5.5 https://coderwall.com/p/mklvdw/install-phpunit-with-composer才能使用composer进行更新。     ,对于PHPUnit 5.7.27和PHP 5.6并在一个测试中测试多个异常,强制进行异常测试很重要。如果没有异常发生,仅使用异常处理来声明Exception实例将跳过测试情况。
public function testSomeFunction() {

    $e=null;
    $targetClassObj= new TargetClass();
    try {
        $targetClassObj->doSomething();
    } catch ( \\Exception $e ) {
    }
    $this->assertInstanceOf(\\Exception::class,$e);
    $this->assertEquals(\'Some message\',$e->getMessage());

    $e=null;
    try {
        $targetClassObj->doSomethingElse();
    } catch ( Exception $e ) {
    }
    $this->assertInstanceOf(\\Exception::class,$e);
    $this->assertEquals(\'Another message\',$e->getMessage());

}
    ,
function yourfunction($a,$z){
   if($a<$z){ throw new <YOUR_EXCEPTION>; }
}
这是测试
class FunctionTest extends \\PHPUnit_Framework_TestCase{

   public function testException(){

      $this->setExpectedException(<YOUR_EXCEPTION>::class);
      yourfunction(1,2);//add vars that cause the exception 

   }

}
    ,PhpUnit是一个了不起的库,但是这一点有点令人沮丧。这就是为什么我们可以使用turbotesting-php开源库的原因,该库具有非常方便的断言方法来帮助我们测试异常。在这里找到: https://github.com/edertone/TurboTesting/blob/master/TurboTesting-Php/src/main/php/utils/AssertUtils.php 要使用它,我们只需执行以下操作:
AssertUtils::throwsException(function(){

    // Some code that must throw an exception here

},\'/expected error message/\');
如果我们在匿名函数中键入的代码未引发异常,则将引发异常。 如果我们在匿名函数中键入的代码引发异常,但其消息与预期的正则表达式不匹配,则也会引发异常。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res