2013-11-06 3 views
6

Я видел много примеров того, как устанавливать заголовки на ответ, но я не могу найти способ проверить заголовки ответа.Как проверить заголовки ответов в laravel 4 для модульного тестирования?

Например, в тесте у меня есть:

public function testGetJson() 
{ 
    $response = $this->action('GET', '[email protected]', null, array('Accept' => 'application/json')); 
    $this->assertResponseStatus(200); 
    //some code here to test that the response content-type is 'application/json' 
} 

public function testGetXml() 
{ 
    $response = $this->action('GET', '[email protected]', null, array('Accept' => 'text/xml')); 
    $this->assertResponseStatus(200); 
    //some code here to test that the response content-type is 'text/xml' 
} 

Как бы идти о тестировании, что заголовок типа содержимого является «применение/JSON» или любой другой тип контента? Может, я что-то недопонимаю?

Контроллеры, с которыми я могу справиться с отрицанием содержимого с заголовком Accept, и я хочу убедиться, что тип контента в ответе правильный.

Спасибо!

+0

попытка 'Request :: заголовок ('принять');' или 'Response :: заголовок ('принять');' –

ответ

10

После некоторых копаться в документации Symfony и Laravel я был в состоянии понять это ...

public function testGetJson() 
{ 
    // Symfony interally prefixes headers with "HTTP", so 
    // just Accept would not work. I also had the method signature wrong... 
    $response = $this->action('GET', '[email protected]', 
     array(), array(), array(), array('HTTP_Accept' => 'application/json')); 
    $this->assertResponseStatus(200); 
    // I just needed to access the public 
    // headers var (which is a Symfony ResponseHeaderBag object) 
    $this->assertEquals('application/json', 
     $response->headers->get('Content-Type')); 
} 
1

Посмотрите на laravel documentation

Request::header('accept'); // or 
Response::header('accept'); 

Получение заголовка запроса

$ значение = Request :: заголовок ('Content-Type');

Другим способом было бы использовать getallheaders():

var_dump(getallheaders()); 

// array(8) { 
// ["Accept"]=> 
// string(63) "text/html[...]" 
// ["Accept-Charset"]=> ... 
+1

While полезно, я хочу проверить фактический объект $ response, созданный в тесте – bigmandan

3

Пока не в частности, о тестировании, хороший способ получить объект ответа Laravel - зарегистрировать обратный вызов «Finish». Они выполняются сразу после отправки ответа непосредственно перед закрытием приложения. Обратный вызов получает запрос и объекты ответа в качестве аргументов.

App::finish(function($request, $response) { 
    if (Str::contains($response->headers->get('content-type'), 'text/xml') { 
     // Response is XML 
    }  
} 
+1

, у вас есть опечатка для 'Str :: cotains'. Я не могу отредактировать его из-за StackOverflow, требующего минимум шести изменений. – kstev

+0

спасибо, все исправлено. – joemaller

1

Для целей отладки Вы можете просто использовать это:

var_dump($response->headers); 
Смежные вопросы