2012-02-03 5 views
10

헤더가 이미 전송되었으므로 실패한 단위 테스트가 있습니다. 그러나이 시나리오의 헤더가 필요합니다.예상 헤더를 테스트하는 방법은 무엇입니까?

500 헤더를 예상하도록 PHPUnit에게 어떻게 말합니까?

나는 this question을 읽었지만 도움이되지 않았습니다.

이 메서드는 출력 버퍼에 래핑됩니다.

ob_start(); 
$foo->methodWhichSendsHeader(); 
ob_clean(); 
+1

귀하의 경우 [이 답변] (http://stackoverflow.com/a/190498/212940)이 올바르지 않습니까? – vascowhite

답변

19

xdebug가 설치된 경우 xdebug_get_headers()를 사용하여 헤더를 가져올 수 있습니다. 그런 다음 필요에 따라 테스트 할 수 있습니다.

$headers=xdebug_get_headers(); 

당신과 같은 배열을 가져옵니다 ...

array(
    0 => "Content-type: text/html", 
    1 => ... 
) 

그래서 당신은 '당신이 할 수있는 경우 값

+0

이 형식은 헤더 ('Content-Type : text/html'); 형식의 호출에 유용하지만 형식이 인 호출에서는 작동하지 않는 것 같습니다. HTTP (HTTP/1.1 500 Internal Server 오류 ');' 이 헤더/상태 코드를 가져 오는 방법은 있습니까? – Derokorian

+0

'header ('HTTP/1.1 500 Internal Server Error');'에서 실제 헤더 내용을 가져올 수는 없지만 내장 된 [http_response_code()] (http://php.net /manual/en/function.http-response-code.php) 브라우저로 리턴 될 HTTP 상태 코드를 검색하십시오. – JSmitty

2

에서 헤더 이름을 분리하기 위해 각 헤더 행을 구문 분석해야합니다 시스템에서 xdebug_get_headers를 사용하지 마십시오. 또 다른 방법은 헤더 기능을 조롱하는 것입니다.

다음은 현재 사용 중입니다. 잘 작동합니다. ...

<?php 
header('Content-type: text/plain; charset=UTF-8'); 
... 

이 같은 테스트 할 수있는 헤더 기능 header 교체 ...이 코드가

<?php 
Testable::header('Content-type: text/plain; charset=UTF-8'); 
... 

다음과 같이 시험 가능한 클래스 구현을 말할 수 있습니다. 함수 앞에 Testable::을 추가하면됩니다. 그렇지 않으면 그들은 보통 기능과 똑같이 작동합니다.

class Testable { 
    private static $headers=array(); 

    static function header($header) { 
     if (defined('UNIT_TESTING')) { 
     self::$headers[]=$header; 
     } else { 
     header($header); 
     } 
    } 

    public static function reset() { 
     self::$headers=array(); 
    } 

    public static function headers_list() { 
     if (defined('UNIT_TESTING')) { 
      return self::$headers; 
     } else { 
      return headers_list(); 
     } 
    } 
} 

지금 당신이해야 할 모든 당신의 검사 결과에 UNIT_TESTING을 정의하는 것입니다,하지만 생산한다. 그런 다음 헤더를 테스트 할 때 Testable::headers_list()으로 전화하십시오.

물론 setcookie, headers_sent 및 HTTP 헤더를 발행하는 기타 기능에 대한 메소드를 추가해야합니다.

+4

그래도 테스트 주체가 수정됩니다. 그 좋지 않다. –

+0

@ 지미 케인 (JimmyKane) - 내가 말할 수있는 한 모든 모의 행위는 허용되지 않습니다. 프로덕션 UNIT_TESTING이 정의되어 있지 않으면 프로덕션 코드에서 Testable :: header에 대한 호출을 남길 수 있습니다. 내가 여기서 누락 된 것이 있습니까? –

+1

내가 말한 것은 클래스에 정적 함수를 추가해야하므로'Testable' 클래스를 수정해야한다는 것입니다. 테스트 할 수 있도록 헤더를 보내는 모든 추상에 정적을 추가하고 편집하고 싶지 않습니다. 그러나 그것은 단지 기본 설정 일뿐입니다. 그 외에 당신의 대답은 좋다. 좋은 하루 되세요. –

관련 문제