_ Mockeyで部分的にmethodを差し替えてテストする
結論だけ書くと超単純で、マニュアルのままなのですが、何故かはまったのでメモです。
以下のようなメソッドをテストしたいとします。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| namespace App\Http\Manager;
class MyClass {
function doSomething(){
if($this->add(1,2)==3){
return true;
} else {
return false;
}
}
function add(a,b){
return a+b;
}
}
|
doSomething()のif文が成功したパターンと失敗したパターンを試験したいのですが、失敗したパターンを発生させることができません。(あくまで例です(^^;)、本当にあり得ないのであればコードを削除しましょう)
この場合、Laravelに標準でバンドルされているMockeryを使って以下のように書けます。
(当初phpUnitで色々検索して迷宮に填まってしまいました。phpUnitのMockやStubでは実現できません)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| namespace tests\Unit;
use App\Http\Manager\MyClass;
use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
use Tests\TestCase;
class MyTest extends TestCase {
use MockeryPHPUnitIntegration;
public function testMyClass() {
// 成功
$myclass = new MyClass();
$result = $myclass->doSomething();
$this->assertTrue($result);
// 失敗
$mock = \Mockery::mock('App\Http\Manager\MyClass')->makePartial();
$mock->shouldReceive('add')->andReturn(5);
/** @noinspection PhpUndefinedMethodInspection */
$result = $mock->doSomething();
$this->assertFalse($result);
}
}
|
19行目でテスト対象クラスをフルパス(?)で指定し、makePartial()を使用で一部のメソッドのみ差し替えを定義します。
20行目で差し替えるメソッドと返り値を定義します。これ以外のメソッドがMyClassに存在しても、それはそのまま実行できます。
$mockには、クラスMyClassのメソッドがそっくり継承されているので、22行目で$mockを使ってdoSomething()を呼び出します。
簡単、明快。