2014-11-04 2 views
5

Скажите, что я хочу заменить метод в объекте, который получает базу данных из базы данных с той, у которой есть данные, предварительно заполненные. Как мне это сделать?Как заменить методы на phpunit

Согласно https://phpunit.de/manual/current/en/test-doubles.html ...

setMethods (массив $ методы) могут быть вызваны на объект Mock Builder для определить методы, которые должны быть заменены с настраиваемым тест двойной. Поведение других методов не изменяется. Если вы вызываете setMethods (NULL), то никакие методы не будут заменены.

Отлично. Так что phpunit сообщает, какие методы я хочу заменить, но где я могу сказать, что я их заменяю?

Я нашел этот пример:

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

Великий - поэтому метод __destruct заменяется. Но на что он заменен? Понятия не имею. Вот источник для этого:

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

+0

Не могли бы вы привести пример 9.2? https://phpunit.de/manual/current/en/test-doubles.html Я имею в виду «Настроить заглушку» –

ответ

7

С методом, который ничего не делает, но чье поведение можно настроить позже. Хотя я не уверен, что вы полностью поняли, как насмешливые работы. Вы не должны издеваться над классом, который вы тестируете, вы должны издеваться над объектами, на которых полагается тестируемый класс. Например:

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

Ваш тест издевается точный класс, который вы пытаетесь проверить, что может быть ошибкой, так как некоторые методы могут быть перекрыты во время издевается.

Смежные вопросы