web-dev-qa-db-ja.com

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を使用しています。

29
Dennis

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によって使用され、シグニチャーなどを変更すると問題が発生する可能性があるため、使用しないでください。

Phpunitが呼び出す特別なsetUpおよびsetUpBeforeClassメソッドを使用できます。

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を使用できます。

そして別のヒント:-vフラグを使用してphpunitを実行し、スタックトレースを表示します;)

36
Sander Visser

Testクラスでparent::__construct();を呼び出すことができます:

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

2019を編集

これを行わないでください。 Sander Visserの答えの方が優れています。彼の答えを読んでください。

10