2010-03-04 3 views
2

Поиск дает пару вопросов по улавливанию фатальных исключений, но этот способ специфичен для использования SimpleTest. (Я знаю, что SimpleTest устарел, но получение PHP-Unit для работы над моей конфигурацией - это еще один вопрос).PHP и SimpleTest - работает tearDown(), даже если есть фатальное исключение

Я пытаюсь заставить метод tearDown() работать, даже когда есть фатальное исключение, поскольку я создаю некоторые тестовые строки в базе данных во время установки и удаляю их во время срывания. Но когда SimpleTest приходит к фатальному исключению, teardown() никогда не запускается.

Есть ли способ получить tearDown() для запуска, несмотря на фатальную эксгументацию?

ответ

3

Существует крючок "register_shutdown_fuction", который может быть использован:

register_shutdown_function(array($this, 'shutdownHandler')); 

В "shutdownHandler" вы можете написать:

error_get_last() && $this->tearDown(); 
1

При возникновении фатальной ошибки процесс PHP завершается - это означает, что нет способа заставить тот же процесс PHP выполнять какой-либо дополнительный код, поскольку его больше нет.

Это также будет означать, что:

  • вы, вероятно, не получите много отчетов
  • другие испытания после того, что заканчивается в Fatal Error не будет работать
  • У вас есть тест это неудачно - плохо.


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


Как вы не можете больше бежать PHP кода в том же процессе, который умер, Единственное решение, которое я вижу, - запустить другой процесс, чтобы запустить очищающий код.

Основная идея состоит в том, чтобы:

  • Launch тесты
  • Используйте другой, совершенно различны, сценарий для запуска очистных операций

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


Теперь, как это сделать автоматическим способом?

Простейшим решением, вероятно, будет использование shell-скрипта, который выполняет обе команды; что-то вроде этого, я бы сказал:

#!/bin/sh 

php /.../launch-tests.php 

php /.../cleanup.php 

И запустите свои тесты, запустив этот shell-скрипт.