概要
モックを使わなくてもテストができればそれに越したことはありません。
最近のMVCフレームワークはユニットテストを考慮された作りになっていることが多いので、あまり苦労することはないかもしれませんが、筆者の環境ではフレームワークのコアの処理や、コアの処理に誰かが加えた変更がユニットテストの実行を阻害するケースがあったので、Mockeryというモッキングフレームワークが役に立ちました。
今回はパーシャルモックという機能について、共有と備忘録の目的で投稿します。
環境
- PHP 5.3
- Zend Framework 1.11
- PHPUnit 3.7
- mockery 0.9.8
インストール
composer require mockery/mockery --dev
基本的な使い方
実際にこういった使い方はあまりしないと思いますが、基本的には以下のようにモックを作成することができます。
class CampaignControllerTest extends PHPUnit_Framework_TestCase
{
public function test_indexAction()
{
// モックを作成
$fakeItemModel = \Mockery::mock('ItemModel');
// ItemModel が array('id' => 1) を返すように
$fakeItemModel->shouldReceive('get')
->andReturn(array('id' => 1));
var_dump($fakeItemModel->get()); // array('id' => 1)
}
}
パーシャルモック
例えば、あるメソッドがAPI通信をしている場合など、テスト対象のクラスの一部のメソッドだけ、テスト時には実行したくないという場合があります。
そういった場合にはパーシャルモックを使うと便利です。
テスト対象クラス
class CampaignController extends Controller
{
public function getItem() {
// ItemModelはAPI通信をしているとする
$mode = new ItemModel();
return $model->get();
}
public function indexAction() {
$item = $this->getItem();
// ここから下をテストしたい
if (is_null($item['id'])) {
echo 'error page!';
}
...
}
}
テストコード
class CampaignControllerTest extends PHPUnit_Framework_TestCase
{
public function test_indexAction()
{
$mock = \Mockery::mock('CampaignController')->makePartial();
$mock->shouldReceive('getItem')
->andReturn(array('id' => null));
$mock->indexAction(); // 'error page!'
}
}
一見するとテストが難しいケースも、こういったライブラリの助けを得ることでテストが可能になります。
ユニットテストを有効活用して、保守性の高いコードを目指したいと思います。
みなさんもぜひチャレンジしてみてください。