كيفية التقاط خطأ" فهرس غير محدد " في الاختبار البسيط?
-
16-09-2020 - |
سؤال
وأود أن أكتب اختبار باستخدام سيمبليتيست التي من شأنها أن تفشل إذا كانت الطريقة أنا اختبار النتائج في فب E_NOTICE
"مؤشر غير محدد :فو".
حاولت expectError()
و expectException()
دون نجاح.صفحة ويب سيمبليتيست تشير إلى أن سيمبليتيست ليست قادرة على التقاط أخطاء فب وقت الترجمة ، ولكن 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();
}
هذا يبدو قليلا معقدة للغاية الحاجة إلى إعادة الإعلان عن معالج الخطأ لرمي استثناء فقط للقبض عليه.كان الجزء الصعب الآخر هو استعادة معالج الخطأ بشكل صحيح عند اكتشاف استثناء ولم يحدث أي خطأ،وإلا فإنه يعبث فقط بمعالجة الأخطاء البسيطة.
نصائح أخرى
ليست هناك حاجة حقا للقبض على خطأ الإشعار.يمكن للمرء أيضا اختبار نتائج 'مجموعة المفاتيح الموجودة' ثم المتابعة من هناك.
http://www.php.net/manual/en/function.array-key-exists.php
اختبار كاذبة وأنها تفشل.
لن تلتقطها أبدا داخل كتلة المحاولة ، لحسن الحظ قمنا بتعيين خطأ():
<?php
function my_handle(){}
set_error_handler("my_handle");
echo $foo["bar"];
?>
يمكنك فعل أي شيء تريده داخل وظيفتي () ، أو اتركه فارغا لإسكات الإشعار ، على الرغم من أنه غير مستحسن.يجب أن يكون المعالج العادي مثل هذا:
function myErrorHandler($errno, $errstr, $errfile, $errline)