【问题标题】:How to show PHP errors when unit testing my Symfony2 bundle?对 Symfony2 包进行单元测试时如何显示 PHP 错误?
【发布时间】:2026-01-09 00:30:01
【问题描述】:

目前,在为我的 Symfony2 包编写单元测试时,我明确设置了 ini_set('display_errors', 1) 以确保我看到我在编写单元测试时所犯的任何错误。这对于致命错误特别有用,例如由方法名称中的拼写错误导致的错误。

示例:

# src/Foo/BarBundle/Tests/Security/RoutePermissionCheckerTest.php

namespace Foo\BarBundle\Tests\Security;

use Symfony\Bundle\FrameworkBundle\Tests\TestCase;

class RoutePermissionCheckerTest extends TestCase
{
    public function testIndex()
    {
        ini_set('display_errors', 1);
        $this->nonExistentMethod();
    }
}

输出:

Configuration read from /Users/maurits_dekkers/Sites/hobby/symfony/saas-seed/app/phpunit.xml.dist
...
Fatal error: Call to undefined method Bb\UserBundle\Tests\Security\RoutePermissionCheckerTest::nonExistentMethod() in /Users/maurits_dekkers/Sites/hobby/symfony/saas-seed/src/Bb/UserBundle/Tests/Security/RoutePermissionCheckerTest.php on line 18

Call Stack:
    0.0314     635432   1. {main}() /Users/maurits_dekkers/pear/bin/phpunit:0
    0.5501    1191328   2. PHPUnit_TextUI_Command::main() /Users/maurits_dekkers/pear/bin/phpunit:46
    0.5502    1192056   3. PHPUnit_TextUI_Command->run() /Users/maurits_dekkers/pear/share/pear/PHPUnit/TextUI/Command.php:129
    1.2241    7133440   4. PHPUnit_TextUI_TestRunner->doRun() /Users/maurits_dekkers/pear/share/pear/PHPUnit/TextUI/Command.php:176
    1.2619    7653720   5. PHPUnit_Framework_TestSuite->run() /Users/maurits_dekkers/pear/share/pear/PHPUnit/TextUI/TestRunner.php:349
   14.0128   37804208   6. PHPUnit_Framework_TestSuite->run() /Users/maurits_dekkers/pear/share/pear/PHPUnit/Framework/TestSuite.php:705
   14.0130   37804608   7. PHPUnit_Framework_TestSuite->runTest() /Users/maurits_dekkers/pear/share/pear/PHPUnit/Framework/TestSuite.php:745
   14.0130   37804608   8. PHPUnit_Framework_TestCase->run() /Users/maurits_dekkers/pear/share/pear/PHPUnit/Framework/TestSuite.php:775
   14.0131   37804608   9. PHPUnit_Framework_TestResult->run() /Users/maurits_dekkers/pear/share/pear/PHPUnit/Framework/TestCase.php:783
   14.0131   37805600  10. PHPUnit_Framework_TestCase->runBare() /Users/maurits_dekkers/pear/share/pear/PHPUnit/Framework/TestResult.php:648
   14.0134   37846840  11. PHPUnit_Framework_TestCase->runTest() /Users/maurits_dekkers/pear/share/pear/PHPUnit/Framework/TestCase.php:838
   14.0134   37848304  12. ReflectionMethod->invokeArgs() /Users/maurits_dekkers/pear/share/pear/PHPUnit/Framework/TestCase.php:983
   14.0134   37848336  13. Bb\UserBundle\Tests\Security\RoutePermissionCheckerTest->testIndex() /Users/maurits_dekkers/pear/share/pear/PHPUnit/Framework/TestCase.php:983

但是,必须有更好的方法通过配置设置。我尝试在我的 config_test.yml 中添加一个额外的 Monolog 设置:

# app/config/config_test.yml
monolog:
    handlers:
        console:
            type:   console
            bubble: false
            level: info

但这不会导致在我的单元测试期间报告 PHP 错误。单元测试只是停止运行。

有没有一种简单的方法可以将我的 Symfony2 项目配置为在单元测试期间始终报告错误?

【问题讨论】:

  • 您无需设置display_errors 即可意识到致命错误,无论如何您都会注意到它们。在测试中设置display_errors,以及一般使用 php_ini 函数是一种不好的做法。
  • 我知道在测试中设置display_errors 是不好的做法,我发布这个问题是为了询问运行单元测试时在控制台中显示致命错误的正确方法。换句话说,我在问什么是“最佳实践”。

标签: symfony phpunit


【解决方案1】:

您可能希望在 PHPUnit 配置文件 (app/config/phpunit.xml) 中将以下参数设置为 true

  • convertErrorsToException
  • convertNoticesToExceptions
  • convertNoticesToExceptions

【讨论】: