Как манипулировать конфигами приложения для тестов контроллеров? - PullRequest
1 голос
/ 27 февраля 2020

Я пишу функциональные / тестовые тесты для приложения ZF3 (на основе PHPUnit и zendframework/zend-test). Вот так:

public function testWhatEver()
{
    $this->dispatch('/');
    $this->assertResponseStatusCode(Response::STATUS_CODE_200);
}

Работает довольно хорошо. Но теперь у меня есть случай, когда мне нужно протестировать приложение с несколькими взаимоисключающими конфигами.

Например, случай «аутентификация»: приложение предоставляет несколько методов аутентификации (скажем, AuthA, AuthB AuthC). (Это настраивается через установку значения auth.type в файле конфигурации.) Я хочу протестировать каждый из них. Это значит, что недостаточно иметь специальные тестовые конфигурации в /config/autoload/test/*{local|global}.php. Мне нужно иметь возможность манипулировать ими для каждого теста (прежде чем я вызову метод dispatch(...)).

Как манипулировать настройками приложения для / из тестов контроллера (на лету)?


Если лучшего решения найти не удастся, возможный обходной путь может заключаться в редактировании файла конфигурации (с помощью file_put_contents(...) или чего-то подобного) перед каждым тестом. Но это немного некрасиво (и медленно).

1 Ответ

0 голосов
/ 28 февраля 2020

В общем, я не вижу действительно хорошего решения этой проблемы. Но есть более или менее приемлемый обходной путь:

Обходной прием 1: манипулирование соответствующим файлом конфигурации для каждого теста

  1. $configs = file_get_contents(...)
  2. searchByRegexAndManipulateConfigs(...)
  3. file_put_contents(...)

Это требует больших усилий и замедляет тестирование (из-за чтения / записи в файловую систему).

Обходной путь 2: простые файлы только с одним значением конфигурации

Мы можем создавать файлы, такие как config.auth.type.php или config.auth.type.txt (по одному на каждое значение конфигурации, чтобы файл был действительно простым) и использовать inclue или file_get_contents(...) вызов как значение в конфигурации. Значение в файле необходимо изменить перед выполнением теста.

Это немного меньше усилий (нам не нужно писать сложные RegEx), но может сделать тест значительно медленнее, так как каждый запрос приложения будет начинаться с чтения дополнительного файла.

Обходной путь 3: передача значений конфигурации через GLOBALS

Это самый простой и быстрый вариант. Мы просто сохраняем необходимое значение в глобальной переменной и читаем его в массиве config (file's). После теста мы удаляем переменную:

AuthBTest

...
protected function setUp() // or setUpBeforeClass()
{
    parent::setUp();
    $GLOBALS['appTestConfigs']['auth.type'] = 'AuthA';
}

protected function tearDown() // or tearDownAfterClass()
{
    parent::tearDown();
    unset($GLOBALS['appTestConfigs']);
}
...

/config/autoload/test/local.php

return [
    'auth' => [
        'type' => isset($GLOBALS['appTestConfigs']['auth.type']) ? $GLOBALS['appTestConfigs']['auth.type'] : 'AuthA',
    ],
];
...