0
0

【備忘録】Composerでautoload-devで定義したクラスが参照できない

Posted at

初めに

composerを使ってアプリケーションを作成していた際、composer.jsonautoload-devで定義したクラスが読み込めませんでした。
解決したので備忘録を残します。

TL;DR

  • autoload-devは、ルートのcomposer.json上でしか定義できない
    • ルートとは、composerコマンドを実行する場所にあるcomposer.jsonのこと

問題

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"
        }
    },

困った:disappointed_relieved:

ちなみにディレクトリ構成はこんな感じでした。

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.jsonautoload-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の意味ないので、よく考えると当たり前ですよね。恥ずかしながら、やってみるまで気が付きませんでした。

ここまでご覧いただきありがとうございました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0