Pergunta

Eu gostaria de escrever um teste, usando o simpleTest que iria falhar se o método que eu estou resultados de testes em PHP E_NOTICE "undefined index :foo".

Eu tentei expectError() e expectException() sem sucesso.O simpleTest página web indicar que simpleTest não é capaz de capturar o tempo de compilação erros do PHP, mas E_NOTICE parece ser um erro de tempo de execução.

Existe uma maneira de capturar um erro e faz com que meu teste falhar, se assim ?

Foi útil?

Solução

Que não era muito fácil, mas eu finalmente consegui pegar a E_NOTICE erro que eu queria.Eu precisava substituir o atual error_handler para lançar uma exceção que eu vou pegar em um try{} instrução.

function testGotUndefinedIndex() {
    // Overriding the error handler
    function errorHandlerCatchUndefinedIndex($errno, $errstr, $errfile, $errline ) {
        // We are only interested in one kind of error
        if ($errstr=='Undefined index: bar') {
            //We throw an exception that will be catched in the test
            throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
        }
        return false;
    }
    set_error_handler("errorHandlerCatchUndefinedIndex");

    try {
        // triggering the error
        $foo = array();
        echo $foo['bar'];
    } catch (ErrorException $e) {
        // Very important : restoring the previous error handler
        restore_error_handler();
        // Manually asserting that the test fails
        $this->fail();
        return;
    }

    // Very important : restoring the previous error handler
    restore_error_handler();
    // Manually asserting that the test succeed
    $this->pass();
}

Isso parece um pouco demasiado complicado ter redeclare o manipulador de erro para lançar uma exceção apenas para pegá-lo.A outra parte mais difícil foi corretamente restaurar o error_handler tanto quando uma exceção foi presa e nenhum erro ocorreu, caso contrário, ele só mexe com SimpleTest de tratamento de erro.

Outras dicas

Não há realmente uma necessidade para pegar o aviso de erro.Pode-se também testar o resultado de 'array_key_exists' e, em seguida, continuar a partir daí.

http://www.php.net/manual/en/function.array-key-exists.php

Teste para falso e tem que falhar.

Você nunca vai pegá-lo dentro do bloco try-catch, felizmente, temos set_error_handler():

<?php
function my_handle(){}
set_error_handler("my_handle");
echo $foo["bar"];
?>

Você pode fazer o que quiser dentro my_handle() função, ou apenas deixe-o vazio para silenciar o aviso, embora, não é recomendado.Um processador normal deve ser como este:

function myErrorHandler($errno, $errstr, $errfile, $errline)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top