--> -->

skimemo


Laravel-20181220 のバックアップ(No.1)


_ 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()を呼び出します。

簡単、明快。