Итак, у меня есть фабричный класс, реализующий Zend \ ServiceManager \ FactoryInterface:

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>

Поэтому для APPLICATION_ENV установлено значение «phpunit». Как написать тест для случая, когда константа другая?

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

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?
    }

}
3
Richard Knop 10 Апр 2013 в 15:57
Почему бы не использовать переменную окружения вместо константы? Таким образом, вы можете использовать putenv по обе стороны от вызова createService в своем тесте.
 – 
Crisp
11 Апр 2013 в 12:20

1 ответ

Лучший ответ

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

Вы могли бы сделать что-то подобное.

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

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

Но я бы тоже посмотрел на класс Gateway. Зачем иногда нужен лишний предмет?

3
jjok 11 Апр 2013 в 14:03