概要
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を使っていることが、差分として発生していました。
そのため、__constructをsetUpに置き換えて見ると、正常にテストは動きました。
PHPUnit マニュアル – 第4章 フィクスチャを見ると、テストデータを生成する際はsetUpを使えと書いてあるので、そもそも__constructを使うのが亜流ということですね…。
PHPUnitのコードを読めば、エラーの原因が詳細にわかりそうなのですが、余力がないの今日はここまで。