为了账号安全,请及时绑定邮箱和手机立即绑定

如何更改 PHPUnit 错误消息以显示自定义错误

如何更改 PHPUnit 错误消息以显示自定义错误

PHP
小怪兽爱吃肉 2021-11-05 10:43:58
我已经用我自己的扩展了 PHP Exception 来添加额外的数据:class MyException extends Exception {   public $foo = [];   public function __construct($message = '', $data = null, $code = 0) {       $this->foo = $data;       paret::__construct($message, $code);   }}在执行正常请求时,这些错误会正确记录,我不想在$this->message.运行测试时,我可以抛出它:if (!$this->save()) {    throw new MyException('Internal Server Error', ['log' => 'missing data'], 500);}PHPUnit 将输出:MyException:内部服务器错误我想要:MyExeption:内部服务器错误;{“日志”:“缺失数据”}如何扩展 PHPUnit 以能够$myException->foo与错误消息一起显示?示例代码:<?phpclass SampleTest extends CTestCase{    public function testIndex()    {        $this->assertTrue($this->save());    }    protected function save()    {        $model = new Orders();        $model->addError('id', 'ID is Required');        if (!$model->validate()) {            throw new HttpApiModelException(500, 'Failed to save', $model);        }        return true;    }}用命令执行 common/vendor/bin/phpunit --configuration tests/phpunit.xml --verbose tests/functional/SampleTest.php和输出:
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

我不确定这是否是最佳选择,但您可以实现测试结果打印机,例如:


<?php


namespace Tests;


use PHPUnit\TextUI\ResultPrinter;


class TestPrinter extends ResultPrinter

{

    protected function printDefect(\PHPUnit\Framework\TestFailure $defect, $count)

    {

        $this->printDefectHeader($defect, $count);


        $ex = $defect->thrownException();

        // you can do whatever you need here, 

        // like check exception type, etc,

        // printing just line number here

        $this->write('Line #' . $ex->getLine() . "\n");


        $this->printDefectTrace($defect);

    }

}

并注册为要使用的打印机(假设使用 xml 配置,但也可以通过命令行完成):


<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd"

         backupGlobals="false"

         colors="true"

         bootstrap="vendor/autoload.php"

         printerClass="Tests\TestPrinter"

>

    <!-- note printerClass attribute above -->

</phpunit>

这样做,您将获得与以下内容相似的输出:


There was 1 error:


1) Tests\SomeTest::testStuff

Line #16

LogicException: whatever

(我只是做了一个简单的测试throw new \LogicException('whatever');)


查看完整回答
反对 回复 2021-11-05
?
呼如林

TA贡献1798条经验 获得超3个赞

因此,如果您需要在每次运行测试时打印这些数据,而不是在生产时打印,那么为什么不扩展基本 Exception 类并检查您是否处于测试环境中,然后连接消息和数据。然后你所有的自定义异常来扩展这个新的 Exception 类。


class BaseException extends Exception {


   public function __construct($message = '', $data = null, $code = 0) {

       if (env('ENVIRONMENT') === 'test') {

           $message .= ' ' . json_encode($data);

       }


       paret::__construct($message, $code);

   }

}

但是此实现将需要更改您的 MyException 类以使用此数据调用父构造函数。


而不是这个


paret::__construct($message, $code);

现在你将拥有这个


paret::__construct($message, $data, $code);

并且还将新BaseException类扩展到您希望具有此功能的这些异常


查看完整回答
反对 回复 2021-11-05
  • 2 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信