#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 за указание, как это сделать, когда вы не можете изменить исходный код по независящим от вас причинам.