Pergunta

Uma pesquisa produz algumas perguntas sobre a captura de exceções fatais, mas essa é específica para usar o SimpleTest. (Eu sei que o SimpleTest está desatualizado, mas fazer com que o PHP-unidade funcione na minha configuração é outra pergunta).

Estou tentando fazer com que o método do desdobramento () funcione mesmo quando houver uma exceção fatal, pois crio algumas linhas de teste no banco de dados durante a configuração e removo-as durante a desmontagem. Mas quando o SimpleTestes chega a uma exceção fatal, o desmontagem () nunca é executado.

Existe uma maneira de fazer com que a desmontagem () corra apesar de uma execução fatal?

Foi útil?

Solução

Existe um gancho "Register_shutdown_fuction" que pode ser usado:

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

Em "ShutdownHandler", você pode escrever:

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

Outras dicas

Quando ocorre um erro fatal, o processo PHP é encerrado - o que significa que não há como ter o mesmo processo PHP executado qualquer tipo de código addionnal, pois não está mais lá.

Isso também significa que:

  • Você provavelmente não receberá muitos relatórios
  • os outros testes após o que acaba em um erro fatal não será executado
  • Você tem um teste que está falhando - mal.


Você deve corrigir o problema: um erro fatal em seu aplicativo é mau ; É ótimo que você o detecte com seus testes automatizados, é claro-mas o próximo passo é fazê-lo desaparecer ;-)


Como você não pode mais executar o código PHP no mesmo processo que morreu, a única solução que vejo seria lançar outro processo, para executar seu código de limpeza.

A idéia básica seria:

  • Inicie seus testes
  • Use outro script, totalmente distinto, para executar as operações de limpeza

Obviamente, isso significa que a limpeza será feita apenas uma vez, depois que todos os testes tenham sido executados; Mas suponho que seja melhor do que nada.


Agora, como fazer isso de maneira automatizada?

A solução mais simples provavelmente seria usar um shell-script, que executa os dois comandos; algo assim, eu diria:

#!/bin/sh

php /.../launch-tests.php

php /.../cleanup.php

E execute seus testes lançando esse shell-script.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top