2014-11-04 11 views
5

Giả sử tôi muốn thay thế một phương thức trong một đối tượng lấy cơ sở dữ liệu từ cơ sở dữ liệu với một đối tượng có dữ liệu được điền trước. Làm thế nào tôi sẽ làm điều này?cách thay thế các phương thức bằng phpunit

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

setMethods (mảng $ phương pháp) có thể được gọi trên đối tượng Mock Builder để xác định các phương pháp mà sẽ được thay thế bằng một bài kiểm tra cấu hình đôi. Hành vi của các phương pháp khác không thay đổi. Nếu bạn gọi setMethods (NULL), thì sẽ không có phương pháp nào được thay thế.

Tuyệt vời. Vì vậy, điều đó nói với phpunit những phương pháp tôi muốn thay thế, nhưng nơi nào tôi nói với nó những gì tôi đang thay thế chúng với?

tôi thấy ví dụ này:

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

lớn - vì vậy phương pháp __destruct đang được thay thế. Nhưng nó được thay thế bằng cái gì? Tôi không có ý kiến. Đây là nguồn cho rằng:

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

+0

Bạn có thể xem ví dụ 9.2 không? https://phpunit.de/manual/current/en/test-doubles.html Tôi có nghĩa là "Định cấu hình cuống" –

Trả lời

7

Với một phương pháp mà không làm bất cứ điều gì, nhưng có hành vi bạn có thể cấu hình sau. Mặc dù tôi không chắc bạn hoàn toàn hiểu cách chế nhạo. Bạn không phải giả mạo lớp bạn đang thử nghiệm, bạn phải giả định các đối tượng mà lớp đang được thử nghiệm dựa vào đó. Ví dụ:

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

Thử nghiệm của bạn giả mạo lớp chính xác bạn đang cố gắng kiểm tra, có thể là do nhầm lẫn vì một số phương pháp có thể bị ghi đè trong khi chế nhạo.

Các vấn đề liên quan