ユニットテスト用のFixtureをいちいち作るのは面倒なのでDBから生成できるようにする。
環境
CakePHP2.7.x
要件
- schemaは自動生成
- データも自動生成
- データは新しいものから最新100件
- 生成したFixtureはサブディレクトリに配置
- 以上を1コマンドで行う
上記を達成するため、bakeコマンドを拡張する。
※注意 サブディレクトリ中のフィクスチャを読み込めるのはCakePHP 2.5.0以降のみなので
それ以前の方は諦めるかいい感じにimportしてください。
準備
1, 2, は初期bakeコマンドで可能。
3の新しいものから生成、4のサブディレクトリへの配置ができるように
bakeコマンドを拡張する。
1, app/LibへFixtureTask.phpを複製、override用のファイルをコピーする。
Fixtureのbake時の挙動は lib/Cake/Console/Command/Task/FixtureTask.php
で定義されている。
これを app/Lib/Cake/Console/Command/Task/FixtureTask.php
にコピーしてoverride用のファイルを作る。
※libの中のファイルはapp/Lib以下に同パスを作っておけばoverrideできる。
※なおapp/Console/Command/Task/FixtureTask.php においてもoverrideできる。Cakeは複数の対応するパスを順々に読んで存在したら返す、というルーティングをよくやる。
2, コピーしたoverride用のファイルを編集し、サブディレクトリ設定を受け取れるようにする。
1 |
// @l95あたり |
1 |
// l300あたり |
これでbakeコマンドに -d [subdirectory-name] のオプションが増え
Text/Fixture/[subdirectory-name]/に生成できるようになる。
3, コピーしたoverride用のファイルを編集し、新しいデータから順に取得できるようにする。
1 |
// l425あたり |
※idのfieldがないテーブルだと使えないけど、CakePHP2の規約に沿っていればそんなことないはず
※2のようにオプション拡張しても良い
コマンドを叩く
1 |
app/Console/cake bake fixture -r -f -n 100 -c default -d base all |
これで全テーブルの最新100件のデータを含んだfixtureがTest/Fixture/base以下に生成されます。
実際はこれを叩きにして個々のテスト用のFixtureを作るべきかな
読みこむ
1 |
class ArticleTest extends CakeTestCase { |
app.[subdirectory]/[fixture]
とする。Test/Fixture直下においた場合app.をつけずに読み込めた場合でも
サブディレクトリに置くときはappから始めないと読み込まない。(はまった)
おまけ
bake fixtureで Fixtureを生成するのはいいとして一応bakeオプションの説明。
和訳しただけです。
オプション | 説明 |
---|---|
–help, -h | ヘルプの表示 |
–verbose, -v | bake中に細かく出力する |
–quiet, -q | bake中に出力しない |
–count, -n | DBから生成したデータを使うときにFixture内に含むデータの数 (初期値: 1) |
–connection, -c | bakeで使う参照元データベース(初期値: default) |
–plugin, -p | Fixtureをbakeするときにつかうプラグインの名前(キャメルケース) |
–schema, -s | Fixtureの中にスキーマをハードコーディングせずに毎回テーブルから取得する。 |
–theme, -t | コードをbakeするときのテーマ。統一テーマを決められる。 |
–force, -f | すでにFixtureファイルがあってもyes/noを訊かずに上書きする |
–records, -r | –countと<テーブル名>/all と一緒につかうと–countで指定した数のレコードを生きているテーブルから取得する。–countで指定しない場合初期値は10件。 |
–directory, -d | 追加したもの 生成したFixtureを置く Test/Fixture/ 以下のサブディレクトリを設定する |
参考
CakePHP 2.x Cookbook - テスト
https://book.cakephp.org/2/ja/development/testing.html
Qiita - CakePHP2でBakeでFixtureをディレクトリ分けする方法
https://qiita.com/yyanbow/items/f8aa8dbc4240e3180cb5