2013-09-22 4 views
1

У меня есть класс, который захотел бы издеваться позже в тесте:Как мне сказать, что при определенных обстоятельствах вызывать оригинальный метод?

class Original { 
    function calculate($a) { ... } 
} 

в тесте:

$mock = $this->getMock('Original',['calculate']); 
$mock->expcets($this->any()) 
    ->will($this->returnValueMap([ 
     [1,'ABC'], 
     [2,'BCD'] 
     // somehow tell $mock to call the original calculate() here 
); 

Я хочу сказать $mock упасть обратно к исходному calculate() при определенных условиях, пример, если аргументы не соответствуют ни одному из предоставленных проверок. Как я понимаю, из чтения кода PhpUnit invoker просто возвращает null, если совпадение не найдено: -?

+0

Одна мантра для письменных тестов - это то, что вы позаботитесь, чтобы они были простыми. Сложный сценарий, который вы пытаетесь достичь, не выглядит так, как я бы сказал. Просто говоря, использование PHPUnit mocks/stubs для этого, вероятно, является неправильным инструментом, и вместо этого вы должны написать свой собственный заглушка для тестирования для этого класса. – hakre

ответ

-1

Точка Mock заключается в том, чтобы не вызывать оригинал, поскольку он имеет зависимость, которую вы не можете контролировать для теста. Когда вы хотите фактически проверить функцию calculate(), затем вызовите тест и используйте обычный код с установленными параметрами, чтобы получить ответ, который вы хотите.

class Original { 
    function calculate($a) { ... } 
} 

$mock = $this->getMock('Original',['calculate']); 
$mock->expcets($this->any()) 
    ->will($this->returnValueMap([ 
     [1,'ABC'], 
     [2,'BCD'] 

$Orig = new Original(); 
$this->assertEquals(4, $Orig->calculates('2 * 2'); 
0

Вы можете сделать это, используя обратный вызов для определения возвращаемого значения. Если аргумент не соответствует ни одному из фиксированных значений, сделать реальный вызов:

$mock = $this->getMock('Original',['calculate']); 
$mock->expects($this->any()) 
->will($this->returnCallback(function($argument) { 
    $values = array(
     1 => 'ABC', 
     2 => 'BCD' 
    ); 
    if (isset($values[$argument]) { 
     return $values[$argument]; 
    } else { 
     return (new Original)->calculate($argument); 
    } 
}); 

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

С уважением