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