Mockeryでできること
MockeryはPHPでテスト対象のMockを作成するためのライブラリです。詳しい使い方は下の記事がメッチャ参考になりました。
「Mockery」を使ってサクッとPHPのテストを書いてみる | アライドアーキテクツ エンジニアブログ
本記事の目的
上の記事ではMockの作成をテストケースのメソッド内に書いていますが、テスト内容と関係のないモック作成の行数が増えると凝集度が低くなり理解しづらいコードになってしまいます。
本記事では、以下のことを目的とします。
- テストケースを別メソッドに切り出すサンプルを紹介する
- overloadした際のテストケース(上記事参照)を扱う。
ただし、上の記事を読んだことが前提となります。
別メソッドでMockを作成するサンプル
テスト対象のクラス
<?php
class SampleExecuter {
public function doSomething($checkType, $param) {
$factory = new CheckerFactory($checkType); // Mock化対象
$checker = $factory->create();
if ($checker->checkSomething($param)) {
return 'trueが返ったよ';
} else {
return 'falseが返ったよ';
}
}
}
テスト
test.php
<?php
use \Mockery as M;
class SampleTest extends PHPUnit_Framework_TestCase
{
// テストケースがシンプルになった
public function test_doSomeThing_チェックOK() {
$target = createTargetMock; // Mockを作る
$this->assertEquals('trueが返ったよ', $target->doSomething('hoge','foo'));
}
// Mock作成部を切り出した
private futction createMock()
{
$checkerMock = M::mock('XXXChecker');
$checkerMock
->shouldReceive('checkSomething')
->with('foo')
->andReturn(true);
$factoryMock = M::mock('overload:CheckerFactory');
$factoryMock->shouldReceive('create')->andReturn($checkerMock);
return new SampleExecuter();
}
}
捕捉:名前空間に気をつけよう
Mock化対象の CheckerFactory クラスのnamespaceがpath\to\class
だった場合はMockを作る際に以下のようにする必要がある。
test.php
$factoryMock = M::mock('overload:\path\to\class\CheckerFactory');
あるいは次のようにもかける。
test.php
namespace path\to\class\CheckerFactory; // 名前空間を追加
// 中略
$factoryMock = M::mock('overload:'. CheckerFactory::class);