2014-11-04 13 views
5

Angenommen, ich möchte eine Methode in einem Objekt ersetzen, die Datenbank aus einer Datenbank mit einer Datenbank erhält, die die Daten bereits ausgefüllt hat. Wie würde ich das tun?Wie man Methoden mit phpunit ersetzt

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

setMethods (array $ Methoden) auf dem Mock Builder Objekt die Methoden angeben aufgerufen werden, die mit einem konfigurierbaren Test Doppel ersetzt werden sollen. Das Verhalten der anderen Methoden wird nicht geändert. Wenn Sie setMethods (NULL) aufrufen, werden keine Methoden ersetzt.

Großartig. Das sagt phpunit, welche Methoden ich ersetzen möchte, aber wo sage ich, wofür ich sie ersetze?

fand ich dieses Beispiel:

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

Großen - so die __destruct Verfahren ersetzt wird. Aber womit wird es ersetzt? Ich habe keine Ahnung. Hier ist die Quelle dafür:

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

+0

Können Sie Beispiel 9.2 betrachten? https://phpunit.de/manual/current/en/test-doubles.html Ich meine "Configure the stub" –

Antwort

7

Mit einer Methode, die nichts tut, aber dessen Verhalten Sie können später konfigurieren. Obwohl ich nicht sicher bin, hast du verstanden, wie höhnisch das funktioniert. Sie sollten die Klasse, die Sie testen, nicht verspotten. Sie sollten Objekte verspotten, auf denen die zu testende Klasse beruht. Zum Beispiel:

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

Ihr Test spottet die genaue Klasse, die Sie zu testen, sind versucht, das ist ein Fehler sein könnte, da einige Methoden könnten während spöttischen außer Kraft gesetzt werden.

Verwandte Themen