PHPUnit и функция die

#php #phpunit

#php #phpunit

Вопрос:

Я использую фреймворк phpunit, и у меня есть такой код:

 public function A() {

 try {

   (...some code...)

   die (json_encode ($data));

 }

 catch (Exception $e) {
   die(false);
 }

}
  

Эта функция вызывается через AJAX, и я не могу заменить die на return. Вопрос в том:
Как я могу выполнить модульный тест с подобным кодом?

Я не могу использовать для этого, утверждает.

Спасибо.

Комментарии:

1. Разве этот вопрос не относится к StackOverflow?

2. @slubman, Да, я думаю, что это так. У меня есть один голос за то, чтобы перенести его. Если вы пометите его для перемещения, это поможет выполнить его быстрее.

3. @doctore: Пожалуйста, не редактируйте, чтобы добавить обратно то, что было отредактировано из-за рекомендаций по стилю для этого сайта. Читать tinyurl.com/so-hints за некоторые идеи о том, как задавать вопросы, но в целом добавление благодарности заранее в вопросах — это просто отвлечение от вопроса; в этом сообществе вы выражаете благодарность голосованием и возвращаете услугу, помогая другим с их вопросами.

4. В этом вопросе много «я не могу», но не так много объяснений.

Ответ №1:

Вы не можете это проверить…

Иногда модульное тестирование вызывает проблемы, подобные этой (непроверяемые ситуации). Обычно это означает, что проблема не в тестировании, а в вашем коде и его архитектуре.

Здесь вам следует использовать не die функцию (на самом деле вам не следует использовать die для возврата HTTP-ответа), а echo json, а затем дать скрипту завершиться должным образом (или return json и echo его где-нибудь еще).

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

Вывод: проблема в вашем коде, исправьте это, а затем вы можете попробовать протестировать его. Если вы не можете, то никакого тестирования.

Комментарии:

1. 1 Ты сформулировал это лучше меня. «Если это сложно протестировать, значит, это плохо закодировано».

2. @Blowski : «Если это сложно протестировать, значит, это плохо закодировано». Мне нравится это предложение, это всегда неприятно слышать (я был в такой ситуации много раз), но это почти всегда правда… Хорошее программирование — это сложно 😉

3. 1 от меня тоже за то, что дал мне новое предложение для моей подписи:D

4. хотя это хорошее правило, иногда использование die() — это разница между 5 минутами работы и 5 днями работы. Действительно ли это оправдывает реструктуризацию вашего приложения из-за одной матрицы?

5. @MarkKaplun Вопрос в том, «как протестировать die() «, ответ — вы не можете. Если вы хотите протестировать это поведение , вам придется использовать другое решение. Остальное делайте, что хотите 🙂

Ответ №2:

Почему вы не можете заменить die() на return ?

Моим решением было бы заставить это генерировать исключение, а затем перехватить исключение другим методом. Затем вы можете выполнить модульное тестирование function a() , проверив, что оно выдает правильный тип исключения. Другая функция обрабатывает die() .

Ответ №3:

на самом деле die, похоже, здесь не очень хорошее решение. но если нет способа изменить это, вы, вероятно, могли бы запустить функцию в другом процессе.

для этого вам нужно написать тестовый файл, который запускает функцию A. пример.

 <?php
include 'fileWithAFunction.php';
A();
?>
  

теперь вызовите этот скрипт с помощью shell_exec.

 $return = shell_exec('testscript.php');
  

возвращаемая переменная содержит выходные данные testscript.

Комментарии:

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