Как Вы используете PHPUnit для тестирования функции, если та функция, как предполагается, уничтожает PHP?

Короче говоря, === работы таким же образом, что == делает на большинстве других языков программирования.

PHP позволяет Вам делать сравнения, которые действительно не имеют смысла. Пример:

$y = "wauv";
$x = false;
if ($x == $y)
    ...

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

В PHP, == сравнивает значения и выполняет преобразование типов при необходимости (например, строка "12343sdfjskfjds" станет "12343" в целочисленном сравнении). === сравнит значение И введет и возвратит false, если тип не будет тем же.

, Если Вы смотрите в руководстве PHP, Вы будете видеть, что много функций возвращает "false", если функция перестала работать, но они могли бы возвратиться 0 в успешном сценарии, который является, почему они рекомендуют делать "если (функция ()! == ложь)" для предотвращения ошибок.

35
задан Zee Spencer 28 August 2009 в 15:37
поделиться

2 ответа

As every tests are run by the same PHPUnit process, if you use exit/die in your PHP code, you will kill everything -- as you noticed ^^

So, you have to find another solution, yes -- like returning instead of dying ; or throwing an exception (you can test if some tested code has thrown an expected exception).

Maybe PHPUnit 3.4 and it's --process-isolation switch (see Optionally execute each test using a separate PHP process) might help (by not having everything dying), but you still wouldn't be able to get the result of the test, if PHPUnit doesn't get the control back.

I've had this problem a couple of times ; solved it by returning instead of dying -- even returning several times, if needed, to go back "high enough" in the call stack ^^
В конце концов, я полагаю, что в моем приложении больше нет "кристалла" ... Кстати, если подумать о MVC, наверное, лучше.

23
ответ дан 27 November 2019 в 06:58
поделиться

Я понимаю, что вы уже приняли ответ на этот вопрос, и это старый вопрос, но я полагаю, что это может быть полезно для кого-то, поэтому здесь:

Вместо использования die () , вы можете использовать throw new RuntimeException () (или собственный класс исключения), который также остановит выполнение программы (хотя и другим способом) и использовать PHPUnit setExpectedException () для Лови. Если вы хотите, чтобы ваш сценарий die () при обнаружении этого исключения не печатал абсолютно ничего на уровне пользователя, взгляните на set_exception_handler () .

В частности, я думаю о сценарии, в котором вы поместите set_exception_handler () -вызов в файл начальной загрузки, который тесты не используют, чтобы обработчик там не запускался. независимо от сценария, поэтому ничто не мешает собственной обработке исключений PHPUnit.

7
ответ дан 27 November 2019 в 06:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: