読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。いや、まだ隊長と呼べるほどには至っていないけど、日々がんばります。CakePHPとPlayFrameworkを使って仕事しています。最近はAngular2をさわりはじめたお(^ω^ = ^ω^)

【CakePHP3】phpunitでテストしてみた

CakePHP CakePHP3.x PHP PHPUnit

スポンサードリンク

CakePHP2では結構お世話になりました(不具合の方向で。。。)

CakePHP3ではすんなりいくかな?と思っていたけど、ダメでした。むー。なんででしょう?

とりあえずphpunitインストール

composerでインストールしました。

$ composer require --dev phpunit/phpunit

自作プラグインのロードエラー

テスト

チュートリアル通り、実行しようとするとエラーが発生。

$ ./vendor/bin/phpunit
Cannot load Xdebug - extension already loaded
Exception: Plugin MyPlugins could not be found. in [../TestController.php]

???

色々試してみたら、phpunitだけじゃなくて、/bin/cakeコマンドもエラーがでているっぽい

???

デバッグしてたらわかった。

<?php
    // ...省略
    // 112行目ぐらい
    public static function load($plugin, array $config = [])
    {
        // ... 省略
        if (empty($config['path'])) {
            $paths = App::path('Plugin');
            $pluginPath = str_replace('/', DIRECTORY_SEPARATOR, $plugin);
            foreach ($paths as $path) {
                if (is_dir($path . $pluginPath)) {
                    $config['path'] = $path . $pluginPath . DIRECTORY_SEPARATOR;
                    break;
                }
            }
        }

        if (empty($config['path'])) {
            // ここでエラーが発生している
            throw new MissingPluginException(['plugin' => $plugin]);
        }

どうやら自作したPluginがロードできていないっぽい。なぁーぜぇー?

あ!

  • ~/config/bootstrap.php
<?php
// ...省略
Plugin::load('MyPlugins', ['autoload' => true, 'bootstrap' => true, 'routes' => true]);

実際のディレクトリは~/plugins/my_plugins/だったので、キャメルケース変換とかそんな処理がないからエラーになっているっぽい。

  • ~/config/bootstrap.php
<?php
// ...省略
// plugin名修正
Plugin::load('my_plugins', ['autoload' => true, 'bootstrap' => true, 'routes' => true]);

修正したらうまくいった。(ってかphpunitのエラーと関係ない。凡ミス)

何故かIDEでの実行結果とコンソールの実行結果が違う。

これも自分のところだけ。ってか考え方でした。

IDEのコマンドはこんな感じ

$ ~/vendor/bin/phpunit

コンソールはこんな感じ

$ ./vendor/bin/phpunit

おわかりいただけただろうか・・・・?

ようは相対なのか絶対なのかって話ですよ。この場合絶対パス指定のIDEはただphpunitを実行するだけで、help内容が出力されるだけ。

IDEで使いたい場合はパラメータも含めすべて絶対パスで指定してあげてください。

$ ~/vendor/bin/phpunit --bootstrap ~/tests/bootstrap.php ~/tests/

何故かtableが認識されない

$ ./vendor/bin/phpunit
...
Cake\Database\Exception: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test_table.post_meta' doesn't exist
...

こんなエラーが。。。と思いきや、単純にアプリケーション側のモデルロード処理の名前が間違っていました。。。。orz

2016/09/18 追記

実行するコマンド間違えていました。。。

$ ~/vendor/bin/phpunit --configuration ~/phpunit.xml.dist

雑な感想

やっとテストできたお! (^ω^ = ^ω^)

エラーはいっぱいでたけど、phpunit全然関係なかった。。。