phpunit - sahte php genişletilmiş durum nesnesi

3 Cevap php

Ben varsayılan php istisna nesnesini genişleten bazı eski kodu test ediyorum. Bu kod, özel bir HTML hata iletisi yazdırır.

Ben test kod bir özel durum oluşturduğunda bunun yerine sadece bana tüm HTML mesajı veren temel mesajı yankı böyle bir şekilde bu durum nesnesi alay etmek istiyorum.

Bunu yapmak için bir yol anlamaya olamaz. Eğer açık durumlar için test edebilirsiniz gibi görünüyor, ama genel bir şekilde bir istisna davranışı değiştirmek değil, aynı zamanda bir varsayılan php işlevselliğini genişleten bir nesne kadar alay edemez. (Istisnalar dışında bu başka örnek düşünemiyorum ... ama durum böyle görünüyor)

Ben sorun, nereye alay nesnesi eklemek istiyorsunuz? Sanırım Eğer 'yeni atmak' ile müdahale edemez gibi görünüyor ve bu nesne yöntemi denir yerdir ....

Ya da bir şekilde tüm kodu için genel bir şekilde, istisna davranışı istediğiniz şekilde değiştirmek için mevcut phpunit durum işlevselliğini kullanabilirsiniz ... ama hacky ve kötü olurdu gibi bu görünüyor eğer ....

EDIT: Burada şeyleri daha net yapmak için bazı kod:

class FooTest extends PHPUnit_Framework_TestCase{

    public function testBar(){
        include '/path/to/file.php'; //generates exception

        $this->assertTrue($baz);             
    }
}
 ...
//overridden exception class
class Foo_Exception extends ErrorException{
 ...

yani, vaka bazında bir durumda bunu yapmadan, bu overriden sınıf ile başa çıkmak için bir yol benim bir soru var? Ben istisna, özel durum neden sadece kod davranışlarını test değilim ne olur?

3 Cevap

Ben ilk istisna nesil davranışını yakalayan bir test yazmak istiyorum:

include '/path/to/file.php'; //generates exception
public function testCatchFooException() {
    try {
        $this->assertTrue($baz);             
    }
    catch (Exception $expected) {
        $this->assertEquals('This is expected html from exception', $expected->getMessage());
        return;
    }

    $this->fail('An expected Exception has not been raised Foo_Excpetion.');
}

Şimdi bu kapsama test ile birçok şey yapabilirsiniz. Sen istisna düzeltmek, ya da duruma neden olur kodu düzeltebilirsiniz ya.

Yapabileceğiniz başka bir şey file.php bir sınıfta tamamını sarın olduğunu:

 class FooClass {

    function runFoo() {
        include '/path/to/file.php'; //generates exception

    }   

}

Eğer istisna yalıtmak kadar özü yöntemini kullanarak daha sonra ise test eklemek.

[EDIT]

İşte bazı ciddi usul eski kodu:

<?php
require_once 'helper.php';  //helper file

function countNewMessages($user_id) {
}

function countNewOrders() {
}

function countNewReturns() {
}

function getDB($init = NULL) {
}

function getDisplay() {
}

getDisplay();

?>

Ve burada sarılmış sınıftır:

<?php
require_once '';  //helper file

class Displayer {
    function countNewMessages($user_id) {
    }

    function countNewOrders() {
    }

    function countNewReturns() {
    }

    function getDB($init = NULL) {
    }

    function getDisplay() {
    }
}
?>

Ve şimdi ben bunu test edebilirsiniz:

    function testGetDisplay() {
    $display = new Displayer();

    $this->assertEquals('html code', $display->getDisplay());
}

Ve bunun içinde bireysel işlevlerini test edin. Ve eğer ben buna filiz yöntemleri daha fazla olabilir.

Yukarıdaki deney, bir kapsama testi olarak düşünülebilir. Orada o hatalar olabilir, ama o ne olduğunu olabilir. Ben yöntemleri filiz böylece ben çıktı kırmak yok emin olun ki filizlenip testlerden daha fazla kod kapsama almak.

Extened PHP istisna nesne "baskılar" a kostüm HTML hata sayfası? Bunu hata mesajı demek bütün bir HTML sayfası nedir? Bu çok akıllıca değil ...

Bu konuda ne yapabilirim, istisna getMessage çağrı ve mesaj ayıklamak için HTML hata sayfası ayrıştırmak (this function bakınız) varsayılan özel durum işleyici değiştirmektir. Sonra hata mesajı yazdırmak ve komut öldürebilir. Bu gibi (PHP 5.3):

set_exception_handler(
    function (Exception $e) {
        die(parse_html_error_page($e->getMessage()));
    }
);

Tamam, ben soruyu yanlış anlamışım. Eğer test ediyoruz komut hatayı yakalar ve daha sonra bir hata sayfası yankıları ise, bu istisna ile ilgisi yoktur. Sen ob_ aileyi kullanabilirsiniz:

ob_start();
include $file;
$contents = ob_get_contents();

if (result_is_error($contents))
    die(extract_error_from_result($contents));
else
    echo $contents;

ob_end_clean();