Как запускать тесты с константами и без них?

Я создал небольшую библиотеку, которая требует, чтобы пользователь установил секретную константу, чтобы она работала.

Вот часть моего кода:

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, определяя константы для некоторых тестов, но не для всех?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
487
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот несколько идей:

  1. Включить изоляцию процессов
    Когда изоляция процесса включена, каждый тест будет выполняться в изолированном процессе. Вы должны удалить свою константу из конфигурации и определить ее в setUp, setUpBeforeClass или непосредственно в тестах, где она вам нужна.

  2. расширение ранкита
    Расширение runkit pecl имеет функцию для удаления уже определенной константы. Однако ваши тесты будут зависеть от этого расширения, что не очень приятно.

  3. Перенесите куда-нибудь
    Обычно лучше, когда объект, который вы тестируете, не зависит от глобальных переменных. Перемещение секрета в объект конфигурации упрощает тестирование и затрудняет для пользователя возможность забыть настроить требуемый параметр.

Спасибо, это работает! Для всех, кто читает этот вопрос после меня, я поставил define('SOMELIB_SECRET', 'ThisIsTheSecretForTests'); в setUp() одного класса и использовал processIsolation. Недостаток: это сильно замедляет тесты, так что будьте готовы умножить время тестирования (у меня в 25 раз).

SteeveDroz 14.12.2020 16:11

Что касается других решений, мне не нравится № 2 (по-видимому, то же самое касается и вас), и я согласен, что № 3 был бы идеальным. К сожалению, другие причины заставляют меня придерживаться константы. Я буду иметь это в виду, хотя!

SteeveDroz 14.12.2020 16:13

Другие вопросы по теме