CakePHP1.3でテストコード(2) -フィクスチャをいじってみる(テストデータの動的登録)-
公開日: : CakePHP, IT, SimpleTest
今回は、動的にテストデータを投入する方法を模索しています。
今までの流れ
やりたいこと
「テストケースによって利用するデータを変更したい」
フィクスチャを使うことにより、データを登録することができます。
しかし、通常の使い方では動的に値を登録することができません。
例えば、以下のようなデータをフィクスチャで登録したとします。
id | 巻 | 名前 | 発売日 |
1 | 1 | サンプル | 2012-03-01 |
2 | 1 | サンプル(2) | 2012-04-25 |
今の日時(03/23)で見れば、id2のデータは未発売になり、id1のデータは発売済みになります。
しかし、テストを実施した日によっては両方共、発売済みになります。
上記のように、テストケースを常に実行し続けて、ある日テストが失敗になってしまうような初期データでは困ります。
こういうケースのために、(特に)日時のデータを動的に変更したいのです。
やったこと
フィクスチャで投入するデータを動的に変更できないかやってみました。
変更したのは、フィクスチャとテストケースの2つです。
フィクスチャ
- setInitDataメソッドで追加登録するデータを選べるようにしています。
<注意点>
setInitDataメソッドは__construct後に呼ばれます。
そのため、$normalDataがすでに登録されているので、主キーは別の値にする必要があります。
<?php class SampleFixture extends CakeTestFixture { var $name = 'Sample'; var $import = 'Sample'; protected $records; function __construct() { $this->records = array($this->normalData); parent::__construct(); } /** * 初期データの投入用 */ public function setInitData($type) { unset($this->records); switch ($type) { case 'old': $this->baseData['salesdate'] = date('Y-m-d', strtotime('-10 day')); $this->records = array($this->baseData); break; case 'new': $this->baseData['salesdate'] = date('Y-m-d', strtotime('+10 day')); $this->records = array($this->baseData); break; } } //ベースとなるデータ var $baseData = array( 'id' => 2, 'name' => 'サンプル', ); //設定しない場合に利用されるデータ var $normalData = array( 'id' => 1, 'name' => 'サンプル', 'date' => '2012-01-15',); }
テストケース
- (1)でフィクスチャクラスを読み込みます。
- (3)でフィクスチャで作成したsetInitDataメソッドを呼んでデータをセットします。
- (4)で追加データを登録します(上位クラスにあるinsertメソッドを読んでいます)。
- (2)でフィクスチャクラスを解放。
<?php class SampleTestCase extends CakeTestCase { var $fixtures = array('app.sample'); function startTest($method) { $this->Sample =& ClassRegistry::init('Sample'); $this->SampleFixture =& ClassRegistry::init('SampleFixture'); //(1) echo "------{$method}モデルのテストスタート-------<br />"; } function endTest($method) { echo "------{$method}モデルのテスト終了-------<br />"; unset($this->Sample); unset($this->SampleFixture); //(2) ClassRegistry::flush(); } /** * 指定本の取得 */ public function testGet() { $this->SampleFixture->setInitData('old'); //(3) $this->SampleFixture->insert($this->db); //(4) $result = $this->Sample->get(1); $expected = array('Sample' => array('id' => 1, 'name' => 'サンプル', 'date' => date('Y-m-d', strtotime('-10 day')),), ); //一致するかどうか $this->assertEqual($result, $expected); } }
まとめ
テストケースとフィクスチャを改良することで、最初に登録した値とは別の値を追加して登録できるようにしています。
これにより、日時などのような動的なデータも扱えるようにしています。
他にもっといいやり方があるのかもしれませんが、現時点ではこんな感じでやっています。
広告
関連記事
-
iPhoneアプリ開発 芳名帳アプリ作成(5) -ペンサイズと入力エリア数の設定-
* 今までの流れ - -[http://pplace.jp/2013/06/1531/:titl
-
iPhoneアプリ開発 −iOS6からの「写真」へのアクセス問題−
写真を扱うアプリを開発している際に問題になったこと。 ※結構前の話を今更まとめてみる。 * 写真へ
-
ターミナルでgitのコマンドを補完したりブランチ名を表示する – macでgitを便利に使うために –
* やりたいこと macのターミナルでgitをいじっていると -今のブランチってなんだっけ? -g
-
str_padとsprintfの速度
PHPで同じことが出来る「str_pad」と「sprintf」。 今まではsprintfを使う機会
-
WordPressプラグイン「WP Hatena Notation」にPullRequestを投げた話
WordPressではてな記法が利用できる「WP Hatena Notation」を重宝しています。
-
jQuery Mobileでミスしたこと -JSだけ最新にしてしまってレイアウト崩れたの巻-
* 前提(CDN先) jQuery Mobileを使う場合、cssを自前のサーバにおいて、jsはC
-
Jenkins + iPhoneアプリ(番外1) -TestFlightを利用する-
* これまで - -- 執事(Jenkins)を雇いました。 * やりたいこと Jenk
-
WordPressプラグイン「SyntaxHighlighter Evolved」が動かない!?
* 起きたこと ある時から、本ブログのコードの部分が「SyntaxHighlighter」で表示され
-
github-flowを使っての開発(3) -1つのプロジェクトを複数人で開発-
今まで2回ほどgithub-flowをもとにした開発の流れを書きました。 今回は、複数人で開発をする
-
iPad(Retinaディスプレイモデル)にiOS7を入れてみた
iPadにiOS7を入れてみたので、その報告。 iPhone5にはまだ入れておかないでおこうと思っ