🍰

loadFixtures()を何度試してもReferenced fixture classが出る場合の解決法

2020/09/20に公開

皆さんテストしてますか? CakePHPのテストで模擬データを流し込めるFixtureという機能は、管理が煩雑になりがちなのでテストクラス内で動的に取捨選択することで、Fixtureを細分化し軽量化したいところです。

取捨選択のための方法は、公式ドキュメントではこのような紹介をされているので引用します。(2013年10月25日現在)

class ArticleTest extends CakeTestCase {
    public $fixtures = array('app.article', 'app.comment');
    public $autoFixtures = false;

    public function testMyFunction() {
        $this->loadFixtures('Article', 'Comment');
    }
}

$autoFixturesをfalseにして、テスト内でloadFixtures()すればいいのは分かるのですが、なんと説明はこれだけ。loadFixturesの引数の取り方については一切説明がありません。

##問題点
loadFixtures()の例がこの一種類なので、記法が分からずそのままクラス名を記入しても、何度やっても"Referenced fixture class FooBarFixture not found"と表示されます。単語が2つ連なると途端に駄目なようでした。この解決法として実装の詳細を調べたところ次のようにするべきと分かりました。

##解決法

$this->loadFixtures('FooBar'); // これを

$this->loadFixtures('Foobar'); // こうする

どうやら2語以上のFixtureクラス名はキャメルケース記述ではなく、 先頭のみ大文字で残りは小文字 で参照しているようでした。命名規則に反した参照なのでバグでしょうか?(CakePHP 2.4.2では)とりあえずこのようにするとエラーは止まります。

(13/10/28追記)分割と手動ロードで不必要なデータを読み込ませないことでトータルのテスト速度は上がるものと思われますが、あまり効果のないデータの場合は手動ロードの分0.1-0.2秒ほど遅延が発生するようなので、全て手動ロードにせず状況に応じて使い分けたほうが良いでしょう。

Fixtureを差し替えて快適なテストライフを!

Discussion