CakePHP1.3でテストコード(2) -フィクスチャをいじってみる(テストデータの動的登録)-

公開日: : CakePHP, IT, SimpleTest


cakePHP1.3でのSimpleTestを使ったテストケースの第2回目。
今回は、動的にテストデータを投入する方法を模索しています。

 今までの流れ

 やりたいこと

「テストケースによって利用するデータを変更したい」

フィクスチャを使うことにより、データを登録することができます。
しかし、通常の使い方では動的に値を登録することができません。

例えば、以下のようなデータをフィクスチャで登録したとします。

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

記事を読む

no image

iPhoneアプリ開発 −iOS6からの「写真」へのアクセス問題−

写真を扱うアプリを開発している際に問題になったこと。 ※結構前の話を今更まとめてみる。 * 写真へ

記事を読む

no image

ターミナルでgitのコマンドを補完したりブランチ名を表示する – macでgitを便利に使うために –

* やりたいこと macのターミナルでgitをいじっていると -今のブランチってなんだっけ? -g

記事を読む

no image

str_padとsprintfの速度

PHPで同じことが出来る「str_pad」と「sprintf」。 今まではsprintfを使う機会

記事を読む

WordPressプラグイン「WP Hatena Notation」にPullRequestを投げた話

WordPressではてな記法が利用できる「WP Hatena Notation」を重宝しています。

記事を読む

no image

jQuery Mobileでミスしたこと -JSだけ最新にしてしまってレイアウト崩れたの巻-

* 前提(CDN先) jQuery Mobileを使う場合、cssを自前のサーバにおいて、jsはC

記事を読む

Jenkins + iPhoneアプリ(番外1) -TestFlightを利用する-

* これまで - -- 執事(Jenkins)を雇いました。 * やりたいこと Jenk

記事を読む

no image

WordPressプラグイン「SyntaxHighlighter Evolved」が動かない!?

* 起きたこと ある時から、本ブログのコードの部分が「SyntaxHighlighter」で表示され

記事を読む

no image

github-flowを使っての開発(3) -1つのプロジェクトを複数人で開発-

今まで2回ほどgithub-flowをもとにした開発の流れを書きました。 今回は、複数人で開発をする

記事を読む

iPad(Retinaディスプレイモデル)にiOS7を入れてみた

iPadにiOS7を入れてみたので、その報告。 iPhone5にはまだ入れておかないでおこうと思っ

記事を読む

広告

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

広告

no image
[感想] Effective Objective-C 2.0 ☆☆☆☆★(4.5)

* 構成 - 第1章 Objective-Cに慣れる -

no image
[感想] iOSアプリテスト自動化入門 ☆☆☆(3.0)

* 構成 - Chapter 1 テスト自動化への取り組み

DeployGateを試してみた(iOS編) -DeployGateがiOSに対応-

今までのDeployGate - -[http://pplace.

iPhone/iPadアプリを開発するためにやったこと

今までに、iPhoneを3本ほどリリース((リリースしたアプリは全て1

no image
ターミナルでgitのコマンドを補完したりブランチ名を表示する – macでgitを便利に使うために –

* やりたいこと macのターミナルでgitをいじっていると -今の

→もっと見る

PAGE TOP ↑