PHPUnitでdataProviderが動作せずに時間を食った話

概要

PHPUnitを使って、PHPのテストコードを書いていたところ、dataProviderが動かなくて、数時間悩みました。
備忘録として、情報を残しておきます。

なにがあった?

下記のようなテストコードを書いて、PHPUnitを実行したところ、 rgumentCountError: Too few arguments to function ExampleTest::checkExceptionTest()
というように引数があってないよーというエラーが発生しました。

dataProvider のDoccommentはTypoもなく、メソッド名も適切な名前になっていました。

class ExampleTest extends TestCase
{
    /**
     * @var Example
     */
    public $_obi;

    public function __construct()
    {
        parent::__construct();
        $this->_obj = new Example();
    }

    public function checkExceptionDataProvider():array
    {
        return [
            'number 1' => [1, \LogicException::class, 'number 1'],
            'number 2' => [2, \ErrorException::class, 'number 2'],
        ];
    }

    /**
     * @test
     * @dataProvider checkExceptionDataProvider
     */
    public function checkExceptionTest($param, $errorClass, $errorMessage)
    {
        $this->expectException($errorClass);
        $this->expectExceptionMessage($errorMessage);

        $this->_obj->checkExecption($param);
    }
}

なにが原因だった?

既存でdataProviderを使っている箇所と見比べると、テストケースの初期化として__constructを使っていることが、差分として発生していました。
そのため、__constructsetUpに置き換えて見ると、正常にテストは動きました。

PHPUnit マニュアル – 第4章 フィクスチャを見ると、テストデータを生成する際はsetUpを使えと書いてあるので、そもそも__constructを使うのが亜流ということですね…。

PHPUnitのコードを読めば、エラーの原因が詳細にわかりそうなのですが、余力がないの今日はここまで。