web-dev-qa-db-fra.com

PHPUnit 6.1.x génère une erreur array_merge () lorsque ma classe de test utilise sa propre méthode constructeur

Je reçois cette erreur:

1) XTest::testX
array_merge(): Argument #1 is not an array

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

Sur ce cas de test:

use PHPUnit\Framework\TestCase;

class XTest extends TestCase
{

    function __construct()
    {}

    function testX()
    {
        $this->assertTrue(true);
    }
}

Si je supprime __construct méthode, mes tests réussissent. Que se passe-t-il avec la gestion par PHPUnit de mes méthodes de constructeur de classe? Cela a bien fonctionné dans PHPUnit version 4.8, mais maintenant j'utilise PHPUnit version 6.1.3

29
Dennis

PHPUnit utilise le constructeur pour l'initialisation de la base TestCase

Vous pouvez voir la méthode constructeur ici: https://github.com/sebastianbergmann/phpunit/blob/6.1.3/src/Framework/TestCase.php#L328

public function __construct($name = null, array $data = [], $dataName = '')

Vous ne devriez pas utiliser le constructeur, car il est utilisé par phpunit et toute modification de la signature, etc. peut casser les choses.

Vous pouvez utiliser les méthodes spéciales setUp et setUpBeforeClass que phpunit appellera pour vous.

use PHPUnit\Framework\TestCase;

class XTest extends TestCase
{
    function static setUpBeforeClass()
    { 
       // Called once just like normal constructor
       // You can create database connections here etc
    }

    function setUp()
    {
      //Initialize the test case
      //Called for every defined test
    }

    function testX()
    {
        $this->assertTrue(true);
    }

    // Clean up the test case, called for every defined test
    public function tearDown() { }

    // Clean up the whole test class
    public static function tearDownAfterClass() { }
}

Les documents: https://phpunit.de/manual/current/en/fixtures.html

Notez que setUp est appelé pour chaque test spécifié dans la classe.

Pour une seule initialisation, vous pouvez utiliser setUpBeforeClass.

Et une autre astuce: exécutez votre phpunit avec le -v drapeau pour afficher les traces de pile;)

36
Sander Visser

Vous pouvez appeler parent::__construct(); dans votre classe Test:

public function __construct() {
    parent::__construct();
    // Your construct here
}

Modifier 2019

Ne fais pas ça. La réponse de Sander Visser est meilleure. Lisez sa réponse.

10
Lucas Bustamante