2017-07-21 4 views
0

Ich habe ein Problem mit zu verstehen, was teilweise Mocks sind für verwendet werden. Ein sehr einfaches Beispiel unten:Spottware - teilweise Mocks

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()); 
    } 

} 

diesen Test besteht und eigentlich keine E-Mail senden (so ist es in Ordnung). Als ich diese Mock zu einer teilweisen Mock ändern, wie folgt aus:

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

Es geht auch, aber ich frage mich, warum und was ist der Unterschied?

Und es zum Beispiel in wechselnden:

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

tatsächlich sendet eine E-Mail.

Konnte mir jemand diese Unterschiede erklären (insbesondere Vergleich partielle Mocks zu normalen Standard-Mocks) und wann eine bestimmte Art von Mock zu verwenden.

+0

Onkel Bob hat einen großen Job gemacht, den Unterschied zwischen allen möglichen Testdoppel zu erklären: https://8thlight.com/blog/uncle-bob/2014/05/14/TheLittleMocker.html – mingos

Antwort

0
class ClassYouWantToTest { 

    public function a(); 

    public function b(); 

} 

Wenn Ihre Methode a() verwenden Methode b(), und Sie wollen b verspotten() nur eine() zu testen, dann haben Sie teilweise Mock für Ihre Klasse zu verwenden.

Um fortzufahren, verwenden Sie teilweise Schein nur für die Klasse, die Sie testen möchten, wenn Sie eine ihrer Methoden vortäuschen müssen.

+0

So wird es nur innerhalb verwendet ein ** Klassenbereich ** (zwischen Klassenmethoden)? Ich brauche es nie zum Testen zwischen verschiedenen Klassen? – BociucH

+0

Ja, innerhalb eines Klassenbereichs (eigentlich der Klasse, die Sie testen möchten, ansonsten verwenden Sie den üblichen Schein). In der Tat brauchen Sie nicht zwischen den Klassen. Verwenden Sie in diesem Fall normale Mocks. –