2013-04-10 2 views
3

Так что у меня этот фабричный класс, реализующий Zend \ ServiceManager \ FactoryInterface:Как выполнить тестирование класса Factory, который зависит от константы?

class GatewayFactory implements FactoryInterface 
{ 

    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $config = new Config($serviceLocator->get('ApplicationConfig')); 
     if ('phpunit' === APPLICATION_ENV) { 
      return new Gateway($config, new Mock()); 
     } 
     return new Gateway($config); 
    } 

} 

Он всегда возвращает экземпляр шлюза, но добавляет макет адаптер в качестве второго параметра при постоянной APPLICATION_ENV является «PHPUnit».

Я бегу мои модульных тестов с этой конфигурацией:

<?xml version="1.0" encoding="UTF-8"?> 
<phpunit bootstrap="tests/unit/Bootstrap.php" colors="true" backupGlobals="false" backupStaticAttributes="false" syntaxCheck="false"> 
    <testsuites> 
     <testsuite name="mysuite"> 
      <directory suffix="Test.php">tests/unit</directory> 
     </testsuite> 
    </testsuites> 
    <php> 
     <const name="APPLICATION_ENV" value="phpunit"/> 
    </php> 
</phpunit> 

Therefor APPLICATION_ENV установлен в "PHPUnit". Как я могу написать тест для случая, когда константа отличается?

я могу проверить для если условия, но я не могу понять, как проверить для случая, когда он не идет внутрь, если условие:

class GatewayFactoryTest extends PHPUnit_Framework_TestCase 
{ 

    public function testCreateServiceReturnsGatewayWithMockAdapterWhenApplicationEnvIsPhpunit() 
    { 
     $factory = new GatewayFactory(); 
     $gateway = $factory->createService(Bootstrap::getServiceManager()); 
     $this->assertInstanceOf('Mock', $gateway->getAdapter()); 
    } 

    public function testCreateServiceReturnsGatewayWithSockerAdapterWhenApplicationEnvIsNotPhpunit() 
    { 
     // TODO HOW TO DO THIS? 
    } 

} 
+0

Почему бы не использовать среду var вместо константы? Таким образом, вы можете использовать 'putenv' с каждой стороны вызова createService в своем тесте. – Crisp

ответ

3

Вы не должны писать код, который используется только в тестах. Вы должны написать код, который можно протестировать.

Вы могли бы сделать что-то вроде этого.

public function createService(ServiceLocatorInterface $serviceLocator, $mock = null) 
{ 
    $config = new Config($serviceLocator->get('ApplicationConfig')); 

    return new Gateway($config, $mock); 
} 

я бы взглянуть на Gateway класса тоже, хотя. Почему иногда нужен дополнительный объект?