2013-09-22 32 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代碼所理解的,如果找不到匹配,調用者將返回null: - ?

+0

寫作測試的一個咒語是你要小心保持它們的簡單。你試圖達到的複雜情況似乎並不是我想說的。只是說,使用PHPUnit mocks/stubs可能是錯誤的工具,而應該編寫自己的存根來測試該類。 – hakre

回答

-1

模擬的重點是不要調用原始文件,因爲它具有無法控制測試的依賴關係。當你想實際測試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。每個測試都應該檢查你的系統在特定情況下的工作方式。

Regards

相關問題