したいこと
テスト対象のクラスでnewしているクラスが外部APIをコールしているので、
そいつをMock化したい。
公式のマニュアルの例で言うと、
<?php
namespace App;
class Service
{
function callExternalService($param)
{
$externalService = new Service\External(); 🌟このクラスをモック化したい
$externalService->sendSomething($param);
return $externalService->getSomething();
}
}
解決方法
公式のマニュアルでは、これで解決できるはず、、、、
でしたけど、上手くいかず。。。
<?php
namespace AppTest;
use Mockery as m;
/**
* @runTestsInSeparateProcesses
* @preserveGlobalState disabled
*/
class ServiceTest extends \PHPUnit_Framework_TestCase
{
public function testCallingExternalService()
{
$param = 'Testing';
$externalMock = m::mock('overload:App\Service\External');
$externalMock->shouldReceive('sendSomething')
->once()
->with($param);
$externalMock->shouldReceive('getSomething')
->once()
->andReturn('Tested!');
$service = new \App\Service();
$result = $service->callExternalService($param);
$this->assertSame('Tested!', $result);
}
}
肝の部分は、コメント部分にしれっと書いてるアノテーション部分!
上記内容だと、サービスクラスが”class already exists”例外となったのでこちらのURLを参照
https://qiita.com/kadoyau/items/13d515f42a943a6c6c1a
/**
* @runInSeparateProcess
* @preserveGlobalState disabled
*/
このアノテーションに差し替えたら、動き出した!!
さらに、モック化したサービスクラス内の定数を使っていた場合。。。
テストクラス内で別クラスを作成
class Const
{
const SUCCESS = 0;
const FAILURE = 1;
}
それをMockから呼ぶことで解決!
$externalMock = m::mock('overload:App\Service\External', 'Const');
参考URL
公式サイト(概要)
共依存のテスト
https://readouble.com/mockery/1.0/ja/mocking_hard_dependencies.html
定数
https://readouble.com/mockery/1.0/ja/class_constants.html
“class already exists”例外
https://qiita.com/kadoyau/items/13d515f42a943a6c6c1a
まとめ
そもそも、強依存した作りにしないのがベスト、、、なんですけど
時間もなかったし、、仕方なし。
勉強になったけど、、、、土日潰れたーーーーorz