2010-05-14 3 views
2

기본 PHP 예외 객체를 확장하는 레거시 코드를 테스트하고 있습니다. 이 코드는 사용자 정의 HTML 오류 메시지를 인쇄합니다.phpUnit - 모의 PHP 확장 예외 객체

테스트 된 코드가 예외를 생성 할 때 전체 HTML 메시지를 제공하는 대신 기본 메시지를 반향 출력하는 방식으로이 예외 객체를 조롱하고 싶습니다.

나는 이것을 수행하는 방법을 알 수 없다. 명시 적 예외를 테스트 할 수있는 것처럼 보이지만 일반적으로 예외 동작을 변경할 수는 없으며 기본 PHP 기능을 확장하는 객체를 조롱 할 수도 없습니다. (예외를 넘어서 이것에 대한 또 다른 예를 생각할 수는 없지만 ...)

나는 조롱 한 객체를 어디에 부착하겠습니까? 당신이 '새로운 던지기'를 방해 할 수없는 것처럼 보이는데 이것은 객체 메소드가 호출되는 곳입니다 ....

아니면 어떻게 든 기존의 phpunit 예외 기능을 사용하여 예외 동작을 변경 할 수 있다면 .... 당신은 모든 코드에 대한 일반적인 방법으로, 원하는 ...하지만 그것은 해키 나쁜 것처럼이 보인다

편집 :

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{ 
... 

: 여기 일을 명확하게하는 몇 가지 코드는 그래서, 제 질문은,이 경우에 따라 그것을하지 않고,이 클래스를 다루는 방법이 있습니까? 예외의 동작을 테스트하지 않으면 예외가 발생하는 코드는 무엇입니까?

+0

이제는 혼란스러워집니다. 포함의 예외가 잡히지 않으면 첫 번째 응답이 유지되거나 잡히고 두 번째 대답이 유지됩니다. 예외의 종류는 부적합합니다. – Artefacto

+0

당신 말이 맞아요 ... ob_start가 어떻게 처리 할 것인지 혼란 스러웠습니다 ... 그러나 해결책은 오류 메시지를 표시하지 않지만 모든 출력을 똑같이 처리한다는 의미입니다 ... 예외 클래스 자체를 다루는 좀 더 구체적인 해결책에 대해 묻고 있었다고 생각합니다. 그러나 이제는이 과정을 통해 모든 방법이 실현 가능하지 않다고 생각했거나 ... 필연적으로 바람직합니다 ... I 객체의 동작을 다루는 가장 좋은 경우는 각각의 경우에 예외를 발생시키는 것입니다. 막연한 질문을 할 때 상황이 의미가있는 경우가 있습니다. – awongh

답변

1

내가 처음 예외 생성 동작을 캡처하는 테스트를 작성합니다 당신은 ob_ 가족을 사용할 수 있습니다. 예외를 수정하거나 예외를 발생시키는 코드를 수정할 수 있습니다. 당신이 예외를 분리 할 때까지 추출 방법을 사용하는 동안

class FooClass { 

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

    } 

} 

그런 다음 테스트를 추가 : 당신이 할 수있는

또 다른 한가지는 클래스 전체 file.php 포장입니다.

[편집] 여기

는 심각한 절차 레거시 코드 :

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

function countNewMessages($user_id) { 
} 

function countNewOrders() { 
} 

function countNewReturns() { 
} 

function getDB($init = NULL) { 
} 

function getDisplay() { 
} 

getDisplay(); 

?> 

그리고 여기에 랩 클래스 :

<?php 
require_once ''; //helper file 

class Displayer { 
    function countNewMessages($user_id) { 
    } 

    function countNewOrders() { 
    } 

    function countNewReturns() { 
    } 

    function getDB($init = NULL) { 
    } 

    function getDisplay() { 
    } 
} 
?> 

그리고 지금은 그것을 테스트 할 수

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

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

그리고 개별 기능을 테스트하십시오. 그리고 만약 내가 그것에 대한 방법을 더 새싹 수 있습니다.

위 테스트는 커버리지 테스트로 간주됩니다. 거기에 버그가있을 수 있지만 그것이 무엇입니까. 그래서 메소드를 돋보이게하면 테스트에서 코드 커버리지를 더 많이 얻게됩니다. 출력을 중단하지 않도록 할 수 있습니다.

+0

두 번째 예에 대해 더 자세히 설명 할 수 있습니까? 테스트는 어떻게 생겼을까요? $ foo_instance = new FooClass를하면 ... $ foo_instance-> runFoo() ... 테스트 내부에 ?? – awongh

+0

이것은 Michael Feather의 WEWLC 책에서 얻은 것입니다. 그것은 모든 대상이 될 수 있습니다. 내 편집을 참조하십시오. – Gutzofter

0

확장 된 PHP 예외 객체는 costum HTML 오류 페이지를 "인쇄"합니까? 오류 메시지가 전체 HTML 페이지임을 의미합니까? 그다지 영리하지는 않습니다 ...

기본 예외 처리기 (this function 참조)를 대체하고 예외에 대해 getMessage를 호출하고 HTML 오류 페이지를 구문 분석하여 메시지를 추출하는 것입니다. 그런 다음 오류 메시지를 인쇄하고 스크립트를 종료 할 수 있습니다. 이렇게 (PHP 5.3에서) :

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

글쎄, 스크립트는 사용자에게 출력하기 위해 HTML 파일을 포함하기 전에 약간의 사소한 방법으로 오류를 처리합니다. 나는 이것이 아마도 모듈 방식이 아니라고 동의한다 ... 이 오류 처리 클래스가 스크립트 내에서 잡힌 오류에 대한 메시지를 제공하기 때문에 나는이 방법이 효과가 있다고 생각하지 않는다. set_error_handler는 잡히지 않은 오류에 대해서만 작동합니다 .... – awongh

0

OK, 나는 오해했다. 테스트중인 스크립트가 오류를 포착 한 다음 오류 페이지를 표시하면 예외와 관련이 없습니다.

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

지금이 적용 시험에 몇 가지 작업을 수행 할 수 있습니다

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(); 
+0

좀 더 명확하게하기 위해 약간의 코드 또는 의사 코드를 포함해야했는데, 이것이 작동하지 않을 것이라고 생각합니다 :이 스레드는 여전히 던져 보일 것이라고합니다. 예외도 당신이 출력을 버퍼 .... http://stackoverflow.com/questions/2201841/how-do-i-stop-php-output-buffering-from-eating-error-messages 그리고 난 비둘기 후 코드에 추가하면 원래 생각했던 것보다 더 많은 오류가 발생하는 것 같습니다. 아마도 내가 잘못 정의한 질문을 작성했을 것입니다 ... – awongh

+0

만약 당신이 아마 던져진 예외를 볼 수 있습니다 예외 처리기가 오류 메시지를 울리고 스크립트를 강제 종료합니다. 그게 기본 예외 처리기의 동작인지는 모르겠지만 그렇다고해도 예외가 잡히면 적용되지 않습니다. – Artefacto