2014-01-09 3 views
2

Я использую Doctrine APCu Cache в своей системе и, хотя он отлично работает как в разработке, так и в производстве, когда я запускаю PHPUnit для тестирования приложения, строки кода, где закодирована система кеша никогда не отмечены как проверенные.Как проверить код кэша доктрина с PHPUnit

Доктрина APC служба Cache конфигурации:

# 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);

Кто-нибудь знает, как проверить Doctrine Cache с PHPUnit?

ответ

3

Вам нужно будет каким-то образом высмеять объект $this->cache, чтобы всегда возвращать 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 обратно независимо от того, какие. Если этого не происходит (например, метод выборки вообще не вызывается или вызывается более одного раза), PHPUnit не сможет выполнить тест.

Как только вы его издеваетесь, вам нужно каким-то образом ввести кеш в объект, который вы тестируете (так что в вашем объекте $this->cache ссылается на ваш макет, а не на обычный объект кеша).

+0

и как вводить объект? Я использую Cache внутри службы (кеш настроен через Injection Dependency) – unairoldan

+0

Я нашел это решение: http://stackoverflow.com/questions/15606191/functional-test-mock-service-does-not-persist-in- service-container – unairoldan

+0

Это выглядит довольно полным, и вы, вероятно, можете сделать что-то похожее, чтобы ввести свой объект Cache в ApcCache. Поскольку ApcCache, тем не менее, является частью Core Doctrine, я не уверен, почему вам нужно будет написать для него единичный тест (люди в Doctrine должны это сделать), если вы просто не учитесь, то есть. –

Смежные вопросы