SimpleTestで「未定義のインデックス」e_noticeエラーをキャッチする方法

StackOverflow https://stackoverflow.com/questions/3261051

  •  16-09-2020
  •  | 
  •  

質問

SimpleTestを使用してテストを作成したいと思います。メソッドがテストしているメソッドがPHP E_NOTICE "未定義のインデックス:foo"を維持します。

私は成功せずにexpectError()expectException()を試しました。SimpleTest Webページは、SimpleTestがコンパイル時PHPエラーをキャッチできないことを示しますが、E_NOTICEは実行時間エラーのようです。

そのようなエラーを引く方法はあり、それで私のテストに失敗する方法は?

役に立ちましたか?

解決

それは本当に簡単ではありませんでしたが、私は望んでいたE_NOTICEエラーを捉えることができました。現在のerror_handlerを上書きするために、try{}ステートメントにキャッチする例外をスローする必要がありました。

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();
}
.

これは、それをキャッチするためだけに例外をスローするためにエラーハンドラを再分解しなければならない少し過度に複雑なようです。他のハード部分は、例外がキャッチされたときにERROR_HANDLERを正しく復元し、エラーが発生しなかった場合、SimpleTestエラー処理を扱うだけです。

他のヒント

通知エラーを捉える必要はありません。'Array_Key_Exists'の結果をテストしてから、そこから続行することもできます。

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

FALSEをテストして失敗させることができます。

あなたは幸いなことにset_error_handler()を持っています:

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

my_handle()関数内で欲しいものは何でもすることができます。通常のハンドラは次のようにする必要があります。

function myErrorHandler($errno, $errstr, $errfile, $errline)
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top