初めに
composerを使ってアプリケーションを作成していた際、composer.json
のautoload-dev
で定義したクラスが読み込めませんでした。
解決したので備忘録を残します。
TL;DR
-
autoload-dev
は、ルートのcomposer.json
上でしか定義できない- ルートとは、composerコマンドを実行する場所にある
composer.json
のこと
- ルートとは、composerコマンドを実行する場所にある
問題
PHPフレームワークFlowにて、単体テストを実装しようとしていました。
Flowには、PHPUnitのクラスを継承した単体テスト用のBaseクラスがあり、そのクラスを継承してテストケースを作成しようとしました。
実際にテストケースを作成し、実行してみたのですが、、、
$ .\bin\phpunit .\Packages\Application\Neos.Welcome\Tests\Unit\Domain\Model\UsersTest.php
PHP Fatal error: Uncaught Error: Class "Neos\Flow\Tests\BaseTestCase" not found in C:\Path\to\Project\Packages\Application\Neos.Welcome\Tests\Unit\Domain\Model\UsersTest.php:6
phpunitの実行が通らず、、、
原因は、継承したFlowのBaseTestCase
クラスが見つからないという内容のようです。composerのautoloadの設定がうまくいってないことで起きているように見えました。
そこで、Flowのcomposer.json
を確認したのですが、Testsディレクトリはすでにautoload-dev
で定義されていそうです。
"autoload": {
"psr-4": {
"Neos\\Flow\\": "Classes",
"Neos\\Flow\\Core\\Migrations\\": "Scripts/Migrations"
}
},
"autoload-dev": {
"psr-4": {
"Neos\\Flow\\Tests\\": "Tests"
}
},
困った
ちなみにディレクトリ構成はこんな感じでした。
Project
├ Packages
| ├ Application
| | └ Neos.Welcome
| | └ Tests
| | └ Unit/Domain/Model/UsersTest.php ← 作成したテストケース
| └ Framework
| └ Neos.Flow
| ├ Tests
| | └ BaseTestCase.php ← 単体テスト用のBaseクラス
| |
| └ composer.json ← Flowのcomposer.json
|
└ composer.json ← プロジェクト自体のcomposer,json
原因
autoload-dev
はルートのcomposer.json
上でしか定義できないらしいです。
公式ドキュメントを見ると、しっかりと『root-only』と書いてありました。
解決策
ということで、composerコマンドを実行するディレクトリにあるcomposer.json
にautoload-dev
を追加することで解決できました。
"autoload-dev": {
"psr-4": {
"Neos\\Flow\\Tests\\": "./Packages/Framework/Neos.Flow/Tests"
}
}
実行もちゃんと通りました。
> .\bin\phpunit .\Packages\Application\Neos.Welcome\Tests\Unit\Domain\Model\UsersTest.php
PHPUnit 9.6.19 by Sebastian Bergmann and contributors.
.. 2 / 2 (100%)
Time: 00:00.005, Memory: 4.00 MB
OK (2 tests, 2 assertions)
補足
ルートのcomposer.json
でしか定義できないものが他にもあるみたいです。
詳しくはこちらをご覧ください。
終わりに
ライブラリのautoload-dev
をインストールできたらdevの意味ないので、よく考えると当たり前ですよね。恥ずかしながら、やってみるまで気が付きませんでした。
ここまでご覧いただきありがとうございました!