2014-11-04 15 views
5

Dire che voglio sostituire un metodo in un oggetto che ottiene database da un database con uno che ha i dati pre-compilati. Come lo farei?come sostituire i metodi con phpunit

Secondo https://phpunit.de/manual/current/en/test-doubles.html ...

setMethods (array $ metodi) possono essere chiamati sull'oggetto Mock Builder per specificare i metodi che devono essere sostituiti con un test configurabile doppia. Il comportamento degli altri metodi non è cambiato. Se chiami setMethods (NULL), nessun metodo verrà sostituito.

Grande. In modo che indichi a phpunit quali metodi voglio sostituire ma dove posso dirti con cosa li sto sostituendo?

Ho trovato questo esempio:

protected function createSSHMock() 
{ 
    return $this->getMockBuilder('Net_SSH2') 
     ->disableOriginalConstructor() 
     ->setMethods(array('__destruct')) 
     ->getMock(); 
} 

Grande - in modo che il metodo di __destruct è da sostituire. Ma con cosa viene sostituito? Non ne ho idea. Ecco la fonte per questo:

https://github.com/phpseclib/phpseclib/blob/master/tests/Unit/Net/SSH2Test.php

+0

Puoi vedere l'esempio 9.2? https://phpunit.de/manual/current/en/test-doubles.html Intendo "Configura lo stub" –

risposta

7

Con un metodo che non fa nulla, ma il cui comportamento è possibile configurare in seguito. Anche se non sono sicuro di aver capito bene come funziona il mocking. Non si deve prendere in giro la classe che si sta testando, si deve prendere in giro oggetti su cui si basa la classe in fase di test. Per esempio:

// class I want to test 
class TaxCalculator 
{ 
    public function calculateSalesTax(Product $product) 
    { 
     $price = $product->getPrice(); 
     return $price/5; // whatever calculation 
    } 
} 

// class I need to mock for testing purposes 
class Product 
{ 
    public function getPrice() 
    { 
     // connect to the database, read the product and return the price 
    } 
} 

// test 
class TaxCalculatorTest extends \PHPUnit_Framework_TestCase 
{ 
    public function testCalculateSalesTax() 
    { 
     // since I want to test the logic inside the calculateSalesTax method 
     // I mock a product and configure the methods to return some predefined 
     // values that will allow me to check that everything is okay 
     $mock = $this->getMock('Product'); 
     $mock->method('getPrice') 
      ->willReturn(10); 

     $taxCalculator = new TaxCalculator(); 

     $this->assertEquals(2, $taxCalculator->calculateSalesTax($mock)); 
    } 
} 

Il test prende in giro la classe esattamente si sta cercando di verificare, che potrebbe essere un errore, dal momento che alcuni metodi potrebbero essere sovrascritti durante beffardo.

Problemi correlati