2014-01-09 54 views
2

我在我的系統中使用了Doctrine APCu Cache,儘管它在開發和生產中都能很好地工作,但是當我運行PHPUnit來測試應用程序時,代碼行被編碼爲緩存系統從未被標記爲測試。如何使用PHPUnit測試Doctrine Cache代碼

主義APC緩存服務的配置:

# Services 
services: 
    doctrine.common.cache: 
     class: Doctrine\Common\Cache\ApcCache 

代碼標記爲未經測試:

public function findActiveStatus($cache = true) 
{ 
    if (($cache) && ($statusList = $this->cache->fetch('sys_active_status'))) { 
     return unserialize($statusList);  // non-tested 
    } else { 
     $statusList = $this->findAllStatus(); 
     $this->cache->save(
      'sys_active_status', 
      serialize($statusList) 
     ); 

     return $statusList; 
    } 
} 

我已經做了多次請求和操作來測試這個功能,但PHPUnit的永遠標記爲測試這一行。

的代碼行是未經證實的是數字3:return unserialize($statusList);

有誰知道如何測試主義緩存PHPUnit的?

回答

3

您將需要以某種方式模擬$this->cache對象始終在fetch方法上返回true。請參閱文檔here

它看起來像這樣在您的測試:

// Replace 'Cache' with the actual name of the class you are trying to mock 
$cacheMock = $this->getMock('Cache', array('fetch')); 
$cacheMock->expects($this->once()) 
    ->method('fetch') 
    ->will($this->returnValue('some return value')); 

第二行基本上說,我期待着一次調用獲取方法,當我做我要你返回值some return value回不管什麼。如果這種情況沒有發生(例如,根本沒有調用fetch方法,或者調用了多次),PHPUnit將會通過測試。

一旦你弄明白了,你需要以某種方式將緩存模擬注入到正在測試的對象中(以便在對象中,$this->cache引用您的模擬對象,而不是普通緩存對象)。

+0

以及如何注入對象?我在服務中使用緩存(通過依賴注入設置緩存) – unairoldan

+0

我已經找到了這個解決方案:http://stackoverflow.com/questions/15606191/functional-test-mock-service-does-not-persist-in-服務容器 – unairoldan

+0

這看起來相當完整,你可以做類似的事情來將你的Cache對象注入到ApcCache中。因爲ApcCache是​​Core Doctrine的一部分,所以我不確定爲什麼你需要爲它編寫單元測試(Doctrine的人應該這樣做),除非你只是想學習,就是說。 –