2009-08-12 18 views
9

我已經搜索,但無法完全找到我要查找的內容,而且手冊在這方面沒有太多幫助。我對單元測試相當陌生,所以不確定我是否在正確的軌道上。無論如何,在這個問題上。我有一個類:在PHP單元中創建模擬對象

<?php 
    class testClass { 
     public function doSomething($array_of_stuff) { 
      return AnotherClass::returnRandomElement($array_of_stuff); 
     } 
    } 
?> 

現在,顯然我希望AnotherClass::returnRandomElement($array_of_stuff);每次都返回相同的事情。我的問題是,在我的單元測試中,我該如何模擬這個對象?

我已經嘗試將AnotherClass添加到測試文件的頂部,但是當我想測試AnotherClass時,出現「Can not redeclare class」錯誤。

我想我理解工廠類,但我不知道我將如何應用在這種情況下。我是否需要編寫一個完全獨立的AnotherClass類,其中包含測試數據,然後使用Factory類加載而不是真正的AnotherClass?或者是使用工廠模式只是一個紅色的鯡魚。

我嘗試這樣做:

$RedirectUtils_stub = $this->getMockForAbstractClass('RedirectUtils'); 

    $o1 = new stdClass(); 
    $o1->id = 2; 
    $o1->test_id = 2; 
    $o1->weight = 60; 
    $o1->data = "http://www.google.com/?ffdfd=fdfdfdfd?route=1"; 
    $RedirectUtils_stub->expects($this->any()) 
     ->method('chooseRandomRoot') 
     ->will($this->returnValue($o1)); 
    $RedirectUtils_stub->expects($this->any()) 
     ->method('decodeQueryString') 
     ->will($this->returnValue(array())); 

在SETUP()函數,但這些存根被忽略,我不能工作了,是否是什麼我做錯了,或辦法,我訪問AnotherClass方法。

幫助!這讓我瘋狂。

回答

6

通過單元測試,您希望創建包含靜態數據的「測試」類,然後將這些類傳遞給您的測試類。這樣可以消除測試中的變量。

class Factory{ 
    function build() 
    { 
     $reader = new reader(); 
     $test = new test($reader); 
     // ..... do stuff 
    } 

} 

class Factory{ 
    function build() 
    { 
     $reader = new reader_mock(); 
     $test = new test($reader); 
     // ..... do stuff 
    } 

} 
class reader_mock 
{ 
    function doStuff() 
    { 
     return true; 
    } 
} 

由於您使用靜態類,你就必須從計劃中刪除AnotherClass,然後重新創建它,使它只包含返回測試數據的功能。通常情況下,你不想實際從程序中刪除類,這就是爲什麼你像上面的例子那樣傳遞類。

+0

非常好,謝謝你的迴應。一個問題,但;所以,我有一個我的Factory類,它爲我創建了所有的實例。這是進入生產階段。我是否將模擬對象添加到此類中,還是將主要工廠類作爲生產添加,然後爲單元測試添加新的工廠類? – Mike 2009-08-13 07:45:55

+0

這就是你的真實感。您可以創建一個新的工廠類進行測試,也可以確保在測試後清理了Factory類。 – 2009-08-13 14:55:06

相關問題