PHP
PHPUnit
Laravel

LaravelのPHPUnitで Target [Illuminate\Contracts\Debug\ExceptionHandler] is not instantiable. が出た時の話


結論

原因がエラーが発生しているところ以外で起こっている可能性があるので、注意が必要!


詳細

Laravelの拡張機能を開発中にPHPUnitを行なったところ以下のようなエラーが出ました。

* 一部ディレクトリ名を変えています

$ vendor/bin/phpunit --coverage-clover ./coverage/

PHPUnit 5.7.27 by Sebastian Bergmann and contributors.

....... 7 / 7 (100%)

Time: 4.92 seconds, Memory: 16.00MB

OK (7 tests, 16 assertions)

Generating code coverage report in Clover XML format ...PHP Fatal error: Uncaught Illuminate\Contracts\Container\BindingResolutionException: Target [Illuminate\Contracts\Debug\ExceptionHandler] is not instantiable. in /var/www/develop/vendor/my-name/my-extension/vendor/laravel/framework/src/Illuminate/Container/Container.php:749
Stack trace:
#0 /var/www/develop/vendor/my-name/my-extension/vendor/laravel/framework/src/Illuminate/Container/Container.php(631): Illuminate\Container\Container->build('Illuminate\\Cont...', Array)
#1 /var/www/develop/vendor/my-name/my-extension/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(674): Illuminate\Container\Container->make('Illuminate\\Cont...', Array)
#2 /var/www/develop/vendor/my-name/my-extension/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(154): Illuminate\Foundation\Application->make('Illuminate\\Cont...')
#3 /var/www/develop/vendor/my-name/my-extension/vendor/laravel/framework/src/Illuminate/Foundation/Bootst in /var/www/develop/vendor/my-name/my-extension/vendor/laravel/framework/src/Illuminate/Container/Container.php on line 749
PHP Fatal error: Uncaught Illuminate\Contracts\Container\BindingResolutionException: Target [Illuminate\Contracts\Debug\ExceptionHandler] is not instantiable. in /var/www/develop/vendor/my-name/my-extension/vendor/laravel/framework/src/Illuminate/Container/Container.php:749
Stack trace:
#0 /var/www/develop/vendor/my-name/my-extension/vendor/laravel/framework/src/Illuminate/Container/Container.php(631): Illuminate\Container\Container->build('Illuminate\\Cont...', Array)
#1 /var/www/develop/vendor/my-name/my-extension/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(674): Illuminate\Container\Container->make('Illuminate\\Cont...', Array)
#2 /var/www/develop/vendor/my-name/my-extension/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(154): Illuminate\Foundation\Application->make('Illuminate\\Cont...')
#3 /var/www/develop/vendor/my-name/my-extension/vendor/laravel/framework/src/Illuminate/Foundation/Bootst in /var/www/develop/vendor/my-name/my-extension/vendor/laravel/framework/src/Illuminate/Container/Container.php on line 749

phpunitの単体テストは正常に実行されていますが、coverage出力する時にエラーが発生します。

半日近く、色々エラーで調べてみましたが特にこれに関連した情報は出てきませんでした。。。

で、改めてよくよくコマンドを確認してみると……

$ vendor/bin/phpunit --help

...略
--coverage-clover <file> Generate code coverage report in Clover XML format.

そう、htmlを出力する想定だったのですが、間違えて --coverage-clover のオプションを使っていました。。。

--coverage-clover はファイルを指定しないといけないのですが、html想定で実行していた私は間違えてディレクトリを指定していました。

その結果エラーが発生していたようです。

--coverage-html に変えたら正常に実行されました。

エラー内容と原因が関連ないみたいですが、ここは不明です。

Laravel関連でよく発生しているみたいで、githubのissueでもいくつか同様のエラーはみられました。

(原因は同じではなさそうですが)


まとめ

ちゃんとコマンドの内容を確認して実行するようにという自分への戒めの為に書きました。

みなさんもお気をつけください!