2017-07-21 2 views
0

パーシャルモックが何であるかを理解することに問題があります。以下の非常に単純な例:モックリー - パーシャルモック

UserEventTest.php

class UserEventTest extends PHPUnit_Framework_TestCase { 

    public function tearDown() 
    { 
     Mockery::close(); 
    } 

    /** 
    * @test 
    */ 
    public function user_register() 
    { 
     $mailer = Mockery::mock('\App\Mailer'); 
     $mailer->shouldReceive('setEmail') 
       ->shouldReceive('sendActivationMessage') 
       ->andReturn(true); 

     $user = Mockery::mock(\App\User::class); 
     $user->shouldReceive('getEmail') 
      ->andReturn('[email protected]');  

     $userEventHandler = new \App\UserEventHandler($mailer, $user); 

     $this->assertEquals(true, $userEventHandler->onUserRegister()); 
    } 

} 

このテストパスと(結構ですので)実際に電子メールを送信しません。このモックを部分模倣に変更すると、次のようになります。

$mailer = Mockery::mock('\App\Mailer')->makePartial(); 

それでも問題はないと思いますが、違いは何ですか?

例えば、にそれを変更:

$mailer = Mockery::mock('\App\Mailer[setEmail]'); 

すると、実際に電子メールを送信します。

私はこれらの相違点(特に部分模擬と通常の標準模擬とを比較すると)と特定の種類のモックをいつ使用するのかを教えてもらえますか?

+0

Bobさんは、可能なすべてのテストダブルの違いを説明してくれました。https://8thlight.com/blog/uncle-bob/2014/05/14/TheLittleMocker.html – mingos

答えて

0
class ClassYouWantToTest { 

    public function a(); 

    public function b(); 

} 

(テストするために)(あなたの方法は、()は、(B法を使用)し、あなたはBを模擬する場合)のみ、あなたはあなたのクラスのための部分的なモックを使用する必要があります。

再開するには、メソッドの1つをモックする必要がある場合は、をテストするクラスにのみ部分模擬を使用します。

+0

**クラススコープ**(クラスメソッド間)?私は異なるクラス間のテストのためにそれを必要としませんか? – BociucH

+0

はい、クラススコープ内(実際にはテストしたいクラスです。そうでない場合は、通常のモックを使用します)。 実際にはクラスの間には必要ありません。その場合、通常のモックを使用してください。 –