Closed binbin4649 closed 7 months ago
@binbin4649 確認したんですが、BcBakeが出力する bootstrap.php がテストが動くようになってませんでした。 修正しましたので、こちらを参考にしてみてください。 https://github.com/baserproject/BcBake/commit/f8b6ee6fc45f70e7baeb3bc7fe3b82bbf6adbf1b
@ryuring ありがとうございます! dev-5をfetchして、大量のワーニングが消え、ユニットテストが動き出しました。
ついでになんですが、 色々いじり回して、やっとこプラグインのテストが動くようになったんですが、 単純にプラグインをBakeしてテストを動かそうと思うと、fixtureを読み込まない、setUpでclassも読み込まずで、 ドキュメントルートからvendor/bin/phpunit、 でbasercms自体のテストを一通り動かすと、プラグインのテストも動くようになります。 ちなみにその全体テストは大量のエラーとワーニングが出て、いくつかのファイルも書き変わります。 とりあえずこれでプラグインのテストは動くようになったので良いんですが、こんなもんなんですかね?
@binbin4649 あれ?
まず、プラグインのフォルダで次のコマンドを打つ事を前提としています。
../../vendor/bin/phpunit
fixture を読み込まないのは、これまでの fixture が非推奨になったからです。 FixtureFactoryを利用してください。 https://baserproject.github.io/5/core/unittest/fixture
テストは、BcTestCase を継承した方がやりやすいかもしれません。 こちらはコアのテスト作成のドキュメントですが参考にしてみてください。 https://baserproject.github.io/5/core/unittest/
@ryuring
../../vendor/bin/phpunit
はい、プラグインのフォルダでテスト実行してます。
fixtureを読み込まないのもそうなんですが、
public function setUp(): void
{
parent::setUp();
$this->Items = $this->getTableLocator()->get('Hoge.Items');
}
setUpでclass(table)も読み込まないのです。
で、ドキュメントルートから、
vendor/bin/phpunit
を実行してbasercms全体のテストを1回実行すると、
fixtureもclassも読み込むようになります。
vendor/bin/phpunitを実行することで何かが変わってると思うのですが、それがなんなのか分からず、モヤモヤしてる感じです、、
@binbin4649 実際にテスト的にプラグインを作成して、xdebug で setUp で止まるか試したところ止まりました。
コマンドは次のような感じです
cd plugins/Catchup
../../vendor/bin/phpunit tests/TestCase/Model/Table/PostsTableTest.php
なお、テストを行う場合、事前に次の2つの準備が必要でした。
1.マイグレーションファイルを作成する plugins/Catchup/config/Migrations 内に作成します。 参考) https://book.cakephp.org/migrations/3/ja/index.html
2.plugins/Catchup/tests/bootstrap.php
で、プラグインが持つスキーマを構築する
// 一番最終行に記述
(new Migrator())->runMany([
['plugin' => 'Catchup']
]);
※ こちらは BcBake に入れておきます。
@binbin4649 BcBake 側にマイグレーション処理を追加しておきました。 https://github.com/baserproject/BcBake/commit/85358c792a390c3a8e8e7119e2f98adb378646c8
@ryuring ありがとうございます。あとで試してみます。
@ryuring 試した結果、やっぱり全体テストを1回実行しないとエラーになるようです。こちら原因が他にありそうなので、別途調べます。
たぶん別件なんですが、(そしてこのスレに書いて良いものなのか分からないのですが、)
plugins/Hoge/tests/bootstrap.php
(new \Migrations\TestSuite\Migrator())->run(['plugin' => 'Hoge'])
これだと以下のようなエラーが出て動かないので、
PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test_basercms.sites' doesn't exist
(new \Migrations\TestSuite\Migrator())->runMany([
['plugin' => 'BaserCore'],
['plugin' => 'BcBlog'],
['plugin' => 'BcContentLink'],
['plugin' => 'BcCustomContent'],
['plugin' => 'BcEditorTemplate'],
['plugin' => 'BcFavorite'],
['plugin' => 'BcMail'],
['plugin' => 'BcSearchIndex'],
['plugin' => 'BcThemeConfig'],
['plugin' => 'BcThemeFile'],
['plugin' => 'BcUploader'],
['plugin' => 'BcWidgetArea'],
['plugin' => 'Hoge']
]);
こんな感じで動いてます。 (必要なのがどれなのか調べてないので、とりあえず/tests/bootstrap.phpにあったものを丸っとコピーしてます。) これも冗長というか、こんなもんなのかな?とモヤモヤしているところです。
@binbin4649 bootstrapは、自分が作ったプラグインだけ定義する感じです
@binbin4649
PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test_basercms.sites' doesn't exist
このログが出るのがおかしいのですが、このログの詳細を貼って頂くことはできますか? どこから呼び出されているのか知りたい
@ryuring こんな感じです。
1) DubOgp\Test\TestCase\Model\Table\DubOgpConfigsTableTest::testValidationDefault
Cake\Database\Exception\DatabaseException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test_basercms.sites' doesn't exist
/var/www/html/vendor/cakephp/cakephp/src/Database/Schema/Collection.php:160
/var/www/html/vendor/cakephp/cakephp/src/Database/Schema/Collection.php:118
/var/www/html/vendor/cakephp/cakephp/src/ORM/Table.php:521
/var/www/html/vendor/cakephp/cakephp/src/ORM/Query.php:290
/var/www/html/vendor/cakephp/cakephp/src/ORM/Query.php:184
/var/www/html/vendor/cakephp/cakephp/src/ORM/Table.php:1700
/var/www/html/vendor/cakephp/cakephp/src/ORM/Table.php:1255
/var/www/html/plugins/baser-core/src/Plugin.php:201
/var/www/html/plugins/baser-core/src/Plugin.php:156
/var/www/html/vendor/cakephp/cakephp/src/Http/BaseApplication.php:182
/var/www/html/plugins/baser-core/src/TestSuite/BcTestCase.php:194
/var/www/html/plugins/DubOgp/tests/TestCase/Model/Table/DubOgpConfigsTableTest.php:46
/var/www/html/vendor/bin/phpunit:122
Caused by
PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test_basercms.sites' doesn't exist
/var/www/html/vendor/cakephp/cakephp/src/Database/Statement/MysqlStatement.php:39
/var/www/html/vendor/cakephp/cakephp/src/Database/Connection.php:329
/var/www/html/vendor/cakephp/cakephp/src/Core/Retry/CommandRetry.php:70
/var/www/html/vendor/cakephp/cakephp/src/Database/Connection.php:332
/var/www/html/vendor/cakephp/cakephp/src/Database/Schema/Collection.php:158
/var/www/html/vendor/cakephp/cakephp/src/Database/Schema/Collection.php:118
/var/www/html/vendor/cakephp/cakephp/src/ORM/Table.php:521
/var/www/html/vendor/cakephp/cakephp/src/ORM/Query.php:290
/var/www/html/vendor/cakephp/cakephp/src/ORM/Query.php:184
/var/www/html/vendor/cakephp/cakephp/src/ORM/Table.php:1700
/var/www/html/vendor/cakephp/cakephp/src/ORM/Table.php:1255
/var/www/html/plugins/baser-core/src/Plugin.php:201
/var/www/html/plugins/baser-core/src/Plugin.php:156
/var/www/html/vendor/cakephp/cakephp/src/Http/BaseApplication.php:182
/var/www/html/plugins/baser-core/src/TestSuite/BcTestCase.php:194
/var/www/html/plugins/DubOgp/tests/TestCase/Model/Table/DubOgpConfigsTableTest.php:46
/var/www/html/vendor/bin/phpunit:122
@binbin4649 ありがとうございます。ようやく再現できました。
ユニットテストのクラスについて、BcTestCase を継承してと伝えましたが、これが原因のようです。
Cake\TestSuite\TestCase
を継承して実行してみてください。
@ryuring bootstrap.phpに、runManyを書かなくても動くようになりました。 ありがとうございます!
@binbin4649 よかったです!
@ryuring (フォーラムとどちらが良いんだろうと思いながら、こちらで質問します、)
https://qiita.com/ryuring/items/c0b517fc454ff7f08e4b こちらを参考に、プラグインのテストを作ろうとしてますが、 プラグインディレクトリからテスト実行すると、プラグイン内のphpunit.xmlとtests/bootstrap.phpは実行されるんですよね? という前提の元、
bin/cake bake bc_plugin Hoge プラグインを作って、プラグインのディレクトリから、 ../../vendor/bin/phpunit テストを実行すると、 Warning: Constant ROOT already defined in /var/www/html/config/paths.php on line 31 2重定義してまっせというワーニングが大量に出ます。 config/paths.php
こんな感じで直すと、ワーニングは出なくはなりますが、 何か使い方間違えてますでしょうか? もしくは、config/paths.phpを修正してPR出した方が良いでしょうか?