2013-02-20 52 views
1

我在某處讀到,將方法分解成更小的可測試函數是一個好主意,以便可以測試更小的方法。但是我對如何測試調用較小方法的方法感到困惑。這裏有一個例子:PHPUnit - 將代碼分解爲可測試的塊

class MyTestableClass 
{ 
    public function myHugeFunction($list, array $list_filter_params) 
    { 
     // do a bunch of stuff, then... 
     foreach($list as $item) { 
      $this->subFunction($item); 
     } 
    } 

    public function subFunction() 
    { 
     // do stuff for each item 
    } 
} 

和測試類:

class MyTestableClassTest extends PHPUnit_Framework_TestCase 
{ 
    public function testSubFunction 
    { 
     // This tests the smaller, bite-size method, which is good. 
    } 
    public function testMyHugeFunction 
    { 
     // this tests the parent function *and* the subFunction. I'm trying 
     // to test *just* the parent function. 
    } 
} 

我知道如何測試子功能,但因爲我不能存根在同一個類中的方法,我不知道如何測試父方法只有。我想找到一種方式來存儲subFunction,只是返回true。

您是否使用Events和存根事件類?這是我能想到的在同一個類中存儲另一個方法的唯一方法。

+0

MyClass是正在測試的類還是測試本身? – 2013-02-20 15:44:49

+0

@WaleedKhan MyClass是正在測試的類,我將編輯示例進行說明。 – 2013-02-20 16:04:18

+3

我不能肯定地說,因爲你沒有提供*真實的例子*,但它看起來像你誤解了一些東西。 「subFunction」真的是公共接口的一部分嗎?如果不是,你不應該單獨測試它。將軟件分解成可測試的部分也是關於解耦的,但看起來你仍然有一個巨大的緊密耦合的類,而不是多個簡潔的可測試*單元*。 – 2013-02-20 16:30:18

回答

1

除了@fab在他的評論(你真的應該考慮!)中說的話,實際上你可以在SUT中存根/模擬方法。對於你的榜樣,建立自己的SUT對象可能是這樣的:

class MyTestableClassTest extends PHPUnit_Framework_TestCase 
{ 
    public function testSubFunction 
    { 
     // This tests the smaller, bite-size method, which is good. 
    } 
    public function testMyHugeFunction 
    { 
     // first, prepare your arugments $list and $list_filter_params 
     // (...) 

     // Next build mock. The second argument means that you will mock ONLY subFunction method 
     $this->sut = $this->getMock('Namespace\MyTestableClass', array('subFunction')); 

     // now you can set your subFunction expectations: 
     $this->sut->expects($this->exactly(count($list)) 
      ->with($this->anything()); // of course you can make this mock better, I'm just showing a case 

     // start testing 
     $this->sut->myHugeFunction($list, $list_filter_params); 
    } 
} 

PS再次,作爲@fab說:如果你表現出特定的情況下,我敢肯定你會從人們得到了很多很好的答案這裏。

+0

+1,因爲這是我寫的更加簡潔的版本。作爲補充,有些情況下很難擺脫依賴關係,嘲弄不能解決問題;在這些情況下,我發現[Patchwork](https://github.com/antecedent/patchwork/)可以有助於顯式重寫某個方法。 – SDC 2013-02-21 12:26:52