CakePHPでテストケースを作成していると、モデルにも連携するような値をコントローラー側で利用したくなるときがある。(ログインや登録機能など)
その場合、Core側でのテストではController側にテストデータを用意しているようだが、Fixtureにも似たような値があるので、できればこれを利用していきたい。
その方法を調べてみた。
test用のコントローラーでfixtureは指定されているので(そしてこれはControllerをbakeすると勝手に追加されるので)、この値を使う事ができないか調べてみたんだけど、結論から言うと、そもそもFixtureって仮のデータをDBに格納するためのものなのでCakeFixtureManagerクラスとか調べても、getRecordsみたいなメソッドは存在しない。
一番手っ取り早いのは対象のFixtureのクラスをApp::usesとかしてクラスのインスタンスを生成させてしまうやり方で、これはいくつか実践している記事を見つける事ができた。
CakePHPでテストする時にFixtureのデータを再利用してDRYにしよう – でぃべろっぱーってへてむる
TestでFixturesのデータをexpectedに再利用したい – JavaScriptとかPerlとかPHPとかさくらVPSとか勉強する
ここら辺を参考に、HogeFixtureを作成して、その中で入力用のtestDataを用意してみた。
class HogeFixture extends CakeTestFixture { /** * Table name * * @var string */ public $table = 'hoge'; /** * Import * * @var array */ public $import = array( 'model' => 'Hoge'); /** * Records * * @var array */ public $records = array( array (/* hoge recoreds ... */), ); /** * Test Input Data * * @var array */ public $testData = array( 'login_id' => 'idididid', 'login_pw' => 'pwpwpwpw', ); }
そして、各種テストケースのsetUpメソッドとかでこんな感じに指定する。
public function setUp() { parent::setUp(); App:: uses('HogeFixture', 'Test/Fixture'); $this->HogeFixture = new HogeFixture(); $this->HogeFixture->testData; }
で、上記のデータをテスト対象のメソッドに投げる
public function testManagerConfirm() { $testData = $this-> MemberFixture ->testData ; debug( 'ログインテスト' ); $return = $this->testAction( '/login_method/' , array ('data' => $testData, 'method' => 'post' , 'return' => 'vars' )); $this->assertArrayNotHasKey( 'errors', $return); }
たぶんこれでいいと思う。