Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHPUnit 6.1.x throws array_merge() error when my test class uses its own constructor method

I get this error:

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

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

On this test case:

use PHPUnit\Framework\TestCase;

class XTest extends TestCase
{

    function __construct()
    {}

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

If I remove __construct method, my tests pass. What is going on with PHPUnit's handling of my class constructor methods? It worked fine in PHPUnit version 4.8, but now I am using PHPUnit version 6.1.3

like image 747
Dennis Avatar asked May 03 '17 14:05

Dennis


2 Answers

PHPUnit uses the constructor for initialization of the base TestCase

You can see the constructor method here: https://github.com/sebastianbergmann/phpunit/blob/6.1.3/src/Framework/TestCase.php#L328

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

You shouldn't use the constructor, because it's used by phpunit and any change to the signature etc can break things.

You can use the special setUp and setUpBeforeClass methods which phpunit will call for you.

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() { } } 

The docs: https://phpunit.de/manual/current/en/fixtures.html

Note that the setUp gets called for every specified test in the class.

For a single initialization you can use setUpBeforeClass.

And another tip: run your phpunit with the -v flag to display stack traces ;)

like image 167
Sander Visser Avatar answered Oct 08 '22 11:10

Sander Visser


As Sander Visser's answer correctly pointed, the parent constructor might have additional parameters, etc, and generally you'd want to use setUpBeforeClass or setUp, but, if you know what you're doing, you can call parent::__construct(); in the constructor of your Test class:

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

Edit 2019

In Codeception, this can also be caused by an invalid YML indentation on your suite file.

like image 35
Lucas Bustamante Avatar answered Oct 08 '22 13:10

Lucas Bustamante