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);
    }
}

 まとめ

テストケースとフィクスチャを改良することで、最初に登録した値とは別の値を追加して登録できるようにしています。
これにより、日時などのような動的なデータも扱えるようにしています。

他にもっといいやり方があるのかもしれませんが、現時点ではこんな感じでやっています。

広告

関連記事

datebox-date

jQueryMobileでカレンダー表示 -DateBoxプラグインの利用-

スマートフォン対応をしているとカレンダーの表示の仕方をスマートフォンらしくしたいことがあると思います

記事を読む

no image

jQuery Mobileでdata-role=headerを使うときの注意点 -勝手にタイトルが変更される件-

* 現象 +headタグでtitleタグで文字列(A)を記述している +data-role=he

記事を読む

iPhoneアプリ開発 -UIScrollViewでタッチを取得-

* やりたいこと UIScrollViewでタッチを取得する。 * 方法 通常のUIScrollV

記事を読む

NEC_0882

Facebookで名刺を作ってみた -Mooの名刺作成サービス-

1ヶ月~半月くらい前に話題になっていたMooの名刺作成サービス。 話題になっていた時期に注文した名

記事を読む

Jenkins + DeployGate(1) -DeployGateでAndroidアプリ開発-

TestFlight for Androidが発表されて1ヶ月ぐらいたちますが、音沙汰がありません。

記事を読む

no image

Facebookがちょっとコワイ vol.1 -自分の情報をコントロールできない-

Facebookの最近の広がり方などを見ていて、少々不安を感じたので思ったことをつらつらと書いてみま

記事を読む

no image

iPhoneアプリ開発 -スライドアウトするスプラッシュ画像-

* やりたいこと アプリを起動すると表示される画像(スプラッシュ画像)があります。 単に表示されるだ

記事を読む

input

CakePHP2系でTwigを利用 -書き方のメモ-

CakePHP2系でTwigをどのように記述するかのメモ。 数パターンしか載せてないですが、だいた

記事を読む

no image

iPhoneアプリ開発 -UIScrollViewで画像を拡大・縮小-

* やりたいこと UIScrollViewでピンチアウト・インして上に乗っている画像を拡大・縮小した

記事を読む

no image

iPhoneアプリ開発 −遷移先のViewControllerに値を引き継ぎたい−

例えば、トップページに複数個のボタンがあって、「A」と「B」というボタンを押下した際に、同じView

記事を読む

広告

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 ↑