PHPUnit 6.1.x выдает ошибку array_merge(), когда мой тестовый класс использует свой собственный метод конструктора

Я получаю эту ошибку:

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

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

В этом тестовом случае:

use PHPUnit\Framework\TestCase;

class XTest extends TestCase
{

    function __construct()
    {}

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

Если я удалю метод __construct, мои тесты пройдут. Что происходит с обработкой PHPUnit методов моего класса? Он отлично работал в PHPUnit версии 4.8, но теперь я использую PHPUnit версии 6.1.3

Ответ 1

PHPUnit использует конструктор для инициализации базового TestCase

Вы можете увидеть метод конструктора здесь: https://github.com/sebastianbergmann/phpunit/blob/6.1.3/src/Framework/TestCase.php#L328

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

Вы не должны использовать конструктор, потому что он используется phpunit и любые изменения подписи и т.д. Могут сломать вещи.

Вы можете использовать специальные setUp и setUpBeforeClass которые phpunit будет вызывать для вас.

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

Документы: https://phpunit.de/manual/current/en/fixtures.html.

Обратите внимание, что setUp для каждого указанного теста в классе.

Для одиночной инициализации вы можете использовать setUpBeforeClass.

И еще один совет: запустите ваш phpunit с флагом -v для отображения следов стека;)

Ответ 2

Вы можете вызвать parent::__construct(); в вашем тестовом классе:

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

Редактировать 2019

Не делай этого. Сандер Visser ответ лучше. Прочитайте его ответ.