FuelPHPをやってみる (6) - モデルテストとモック -
例えば以下のようなモデルクラスがあった場合
fuel/app/classes/model/items.php
<?php
class Model_Items extends Model_Crud {
protected static $_table_name = "items";
public static function findById($id) {
$entry = null;
try {
$entry = static::find_one_by("id", $id);
} catch (Database_Exception $e) {
Log::warning($e->getMessage());
}
return $entry;
}
}
まぁ単純にID値から取得するだけのメソッドを定義する。で問題は実際にfind_one_byが失敗した場合(例外により)、結果がちゃんと「NULLである」という保証をテストする必要があると思いますけど。でどうやってそれを再現させるかってところなんですが、まぁよくあるパターンとしてモックでfind_one_byを実行させると例外が出るように設定する。まぁそんな感じの事したいっていう事でやってみた
んまぁFuelPHPネタというよりはPHPUnitネタに近いですけど
fuel/app/tests/model/test_items.php
<?php
class Test_Model_Items extends TestCase {
public function test_findById() {
// findメソッドを実行する事で例外が発生するようにモックを仕込む
$mock = $this->getMock("Model_Items", array("find"));
$mock->staticExpects(
$this->any()
)->method(
"find"
)->will(
$this->throwException(new Database_Exception("stub error"))
);
// 普通にやると問題なく出来る
$entry1 = Model_Items::findById(1);
$this->assertNotNull($entry1);
$this->assertEquals("iPhone", $entry1->item_name);
$this->assertEquals(39800, $entry1->price);
// モックオブジェクト経由でfindメソッドを利用するメソッドを実行すると例外が差し込まれてるので、実行するとtry内で例外が発生する
$entry2 = $mock::findById(1);
$this->assertNull($entry2);
}
}
実際にログを見るとLog::warningされているのが確認できる。ってな感じでそういう事象のテストをやる場合にはモック差し込みで実現は可能っぽい