3
votes

Currently, when writing a unit test for my Symfony2 bundle, I explicitly set ini_set('display_errors', 1) to make sure I see any errors I made in writing my unit test. This is particularly helpful for fatal errors, such as those resulting from typos in method names.

Example:

# 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();
    }
}

Output:

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

However, there must be a better way by means of a configuration setting. I've tried adding an extra Monolog setting to my config_test.yml:

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

but that does not result in PHP errors being reported during my unit test. The unit test simply stops running.

Is there an easy way to configure my Symfony2 project to always report errors during a unit test?

1
You don't need to set display_errors to be aware of fatal errors, you will be noticed about them anyway. Setting display_errors inside a test, as well as using php_ini function in general, is a bad practise.Hast
I understand that setting display_errors inside a test is bad practice, I posted this question to ask for the right way to get fatal errors to show in the console when running a unit test. In other words, I'm asking what the "best practice" is.maurits

1 Answers

3
votes

You might want to set the following parameters to true in your PHPUnit configuration file (app/config/phpunit.xml):

  • convertErrorsToException
  • convertNoticesToExceptions
  • convertNoticesToExceptions