[Laravel]モックを使ったテストメモ

したいこと

テスト対象のクラスで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/index.html#%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9

共依存のテスト

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です