1. Fixtureのロードは、各テストケースごとに行う
冒頭で public $autoFixtures = false;
を記述しておく
/**
* Fixtures
*
* @var array
*/
public $fixtures = [
'app.Hoge',
'app.Fuga',
];
public $autoFixtures = false;
各テストケース内でFixtureをロードする
/**
* Test something method
*
* @return void
*/
public function test_something()
{
$this->loadFixtures(
'Hoge',
'Fuga'
);
参照
2. テストごとにFixtureを分ける
同じテーブルに対して、複数のテストから利用していると、
AテストのためにFixtureを編集すると
Bテストがコケる、ということに遭遇します。
あっちをいじると、こっちがおかしくなる・・・・で、めんどくさいので
テストケースごとに Fixtureを用意する。
テストケースごとのFixture置き場
Fixtureディレクトリに任意のディレクトリ(something
)を作ってその中に配置。
tests/Fixture/something/somethingTableFixture.php
テスト側での呼び出し
/**
* Fixtures
*
* @var array
*/
public $fixtures = [
'app.something/somethingTable',
];
public $autoFixtures = false;
/**
* Test something method
*
* @return void
*/
public function test_something()
{
$this->loadFixtures(
'somethingTable'
);
loadFixtures
するときは Fixtureクラスの名前だけでおk。
Fixture作成に便利なコマンドオプション
$ bin/cake bake fixture -s -c [default以外のDB] [Table名] -r -n 5
$ bin/cake bake fixture -s -c [default以外のDB] [Table名] -r -n 5 --conditions "city='Tokyo'"
- -s:スキーマの定義はDBから取得して利用する。Fixtureファイルに直接定義が書かれない。
- -c:default以外のDBのコネクション名を指定。
- -r:実際のDBデータからレコードをとってくる。
- -n:何件とってくるか。
- --conditions:とってくる条件。SQLのwhere。
3. 謎のトランザクションエラー回避のためのおまじない
たまに起きる 謎のトランザクションエラー
phpunit <ファイル名>
↑で、単体実行するとエラーが出ないのに、
全体実行すると ↓下記のようなエラーが出ることがある。
ERROR: current transaction is aborted, commands ignored until end of transaction block
MySQLだと出たことがないけど、PostgreSQLだと高い確率で遭遇する。
phpunit実行時、裏っかわでは、テスト用のTableをcreateしたり、dropしたりしてるんだが
どうやらこの時、2に記述したような、同Tableを複数のFixtureが利用していると起きるらしい?
ので、tearDown()
におまじないを書いておく
/**
* tearDown method
*
* @return void
*/
public function tearDown()
{
$this->fixtureManager->shutdown(); //ポスグレトランザクションエラー回避
parent::tearDown();
}
参照