Я создал небольшую библиотеку, которая требует, чтобы пользователь установил секретную константу, чтобы она работала.
Вот часть моего кода:
if (!defined('SOMELIB_SECRET')) {
throw new RuntimeException('You need to define the constant SOMELIB_SECRET to use this library');
}
Этот код отлично работает, но я не знаю, как проверить генерацию исключения. Я могу все протестировать, если создам константу в phpunit.xml:
<php>
<const name = "SOMELIB_SECRET" value = "ThisIsTheSecretForTests" />
</php>
Я могу проверить исключение, если не добавлю константу в PHP.
Что я хочу сделать, так это проверить оба, мне нужен способ отключить константу на полпути, что на самом деле не так (оказывается, константы... постоянны).
Я попытался создать 2 тестовых файла: 001_SomeLibWithoutSecretTest.php
и 002_SomeLibWithSecretTest.php
, чтобы создать константу между ними. Это работало в Linux, но теперь, когда я использую Windows, тесты называются наоборот. Кроме того, это немного хакерски: тесты не должны вызываться в заданном порядке.
После всего этого введения, вот мой простой вопрос:
Как я могу запускать тесты с помощью PHPUnit, определяя константы для некоторых тестов, но не для всех?
Вот несколько идей:
Включить изоляцию процессов
Когда изоляция процесса включена, каждый тест будет выполняться в изолированном процессе. Вы должны удалить свою константу из конфигурации и определить ее в setUp
, setUpBeforeClass
или непосредственно в тестах, где она вам нужна.
расширение ранкита
Расширение runkit pecl имеет функцию для удаления уже определенной константы. Однако ваши тесты будут зависеть от этого расширения, что не очень приятно.
Перенесите куда-нибудь
Обычно лучше, когда объект, который вы тестируете, не зависит от глобальных переменных. Перемещение секрета в объект конфигурации упрощает тестирование и затрудняет для пользователя возможность забыть настроить требуемый параметр.
Что касается других решений, мне не нравится № 2 (по-видимому, то же самое касается и вас), и я согласен, что № 3 был бы идеальным. К сожалению, другие причины заставляют меня придерживаться константы. Я буду иметь это в виду, хотя!
Спасибо, это работает! Для всех, кто читает этот вопрос после меня, я поставил
define('SOMELIB_SECRET', 'ThisIsTheSecretForTests');
вsetUp()
одного класса и использовалprocessIsolation
. Недостаток: это сильно замедляет тесты, так что будьте готовы умножить время тестирования (у меня в 25 раз).