2012-07-18 122 views
3

我有一個複雜的後端應用程序,使用zf 1.11.11和phpunit 3.5.15。該應用程序有一些複雜的通信組件(肥皂,休息等)。在CIS或開發測試環境中,我不得不嘲笑這些模型,因爲我無法建立連接或請求生產第三方後端。因此嘲笑單元測試圖層非常好。全面覆蓋 - 沒問題。問題是我不能在控制器集成測試中使用這種技術。它是一個完全隱藏模型的更高層。所以我想現在注入mock是不可能的。一方面,這是正確和好的,因爲這是集成測試的本質,另一方面,我對控制器測試的覆蓋率非常低。測試策略。 PHPUnit模擬Zend框架控制器集成/煙霧測試

摘要的問題:

  • 我不能創建傳送給commponents(高費用)
  • 我不能注入組件控制器測試期間嘲笑(測試服務我只設置請求數據並觸發調度員)
  • 我控制器上覆蓋的方式對低

我已經看到了它實現了所有作爲一個插件的解決方案。所以有些名稱空間重定向可以指向模擬插件。但我不認爲這是一個好的解決方案。

回答

0

修復您的可測試類的依賴注入問題,添加以下函數或注入構造函數。

function setDependentProperty(Type $value) 
{ 
    $this->_dependency = $value; 
    return $this; 
} 

function getDependentProperty() 
{ 
    if (!isset($this->_dependency)) { 
     $this->_dependency = new DependencyType(); 
    } 
    return $this->_dependency; 
} 

然後用嘲弄的測試

function testUseMockedService() 
{ 
    $testedItem = new ObjectToTest(); 
    $mock = $this->getMock('Service_ToMock', 
     array('functionToMock') 
    ); 
    $mock->expects($this->exactly(1)) 
     ->method('functionToMock') 
     ->will($this->returnValue($valueYouWant)); 

    $testedItem->setDependency($mock); 
    $returnValue = $testedItem->doStuff(); 

    $this->assertEquals($something, $returnValue); 
} 

明白,單元測試是不集成測試,應該是很孤立的

http://www.typemock.com/unit-tests-integration-tests 

明白,有報道沒有「權利」量

http://www.artima.com/weblogs/viewpost.jsp?thread=204677

+0

是的我完全知道單元測試和集成測試之間的區別。我從來沒有把它們設置在問題的同一層次上。 phpunit/zf1控制器測試(http://framework.zend.com/manual/de/zend.test.phpunit.html)不會給你對控制器的「直接」訪問。這是打算!好的!你只觸發調度員。您無權訪問較低的組件。只有要求和迴應。 – jami 2012-07-18 18:55:31

+0

您應該將自己的邏輯推向模型,在控制器中應該幾乎沒有任何東西需要測試。例如,應該通過模型訪問所有的依賴關係和服務。使用上面我介紹的第一部分將依賴注入到模型中。作爲例子,我們甚至不在我的項目上測試我們的控制器... – 2012-07-19 23:45:26