2016-10-02 5 views
0

:를 분명히는 HTTP는 응답 - 특성 "원래"대신보기 개체의 문자열을 포함하는 다음과 같이 내가 컨트롤러의 방법에서보기를 반환하고

return view('Main::pages.content-page', compact('content')); 

보기 그러나 제대로 렌더링 내가 응답 객체를 위해 dd 때, I 응답 객체의 "원본"속성은 문자열이지만 뷰 객체 여야합니다.

Response {#385 ▼ 
    +original: """ 
    <!DOCTYPE html>\n 
    <html lang="en">\n 
     <head>\n 
     <meta charset="utf-8">\n 
     <meta http-equiv="X-UA-Compatible" content="IE=edge">\n 
     <meta name="viewport" content="width=device-width, initial-scale=1">\n 
     <meta name="author" content="">\n 
     <meta name="csrf-token" content="2CQirHnZ7isCBRfkhOYkzPAWOzNIqJISrbb1mfDv">\n 
     <meta name="description" content="">\n 
     <meta name="keywords" content="">\n 
      <title id="page_title"> D&eacute;couvrir\n </title>\n 
     ......... 

내 시험에서 본질적으로 보면 다음과 같은 오류

F                 1/1 (100%) 

Time: 179 ms, Memory: 20.00MB 

There was 1 failure: 

1) IndexControllerTest::testGetPageMethod 
The response was not a view. 
Failed asserting that false is true. 

을 받고

$this->get(route('main.page', ['content' => $content->slug])) 
    ->assertResponseOk() 
    ->assertViewHas('content', $content); 

암을하고있는 중이 야하기 때문에 내 테스트 실제로, 그것 때문에 실패 때문에 예상 된 동작입니다 구조는 방법의 이유를 볼 수 있습니다

/** 
* Assert that the response view has a given piece of bound data. 
* 
* @param string|array $key 
* @param mixed $value 
* @return $this 
*/ 
public function assertViewHas($key, $value = null) 
{ 
    if (is_array($key)) { 
     return $this->assertViewHasAll($key); 
    } 

    if (! isset($this->response->original) || ! $this->response->original instanceof View) { 
     return PHPUnit::assertTrue(false, 'The response was not a view.'); 
    } 
    ...... 

원본은 문자열이지만 뷰 객체 여야하므로 조건 ! $this->response->original instanceof View이 실패합니다.

여기에서 길을 잃었습니다. 이 경우 assertViewHas 메서드의 조건이 충족되는 이유는 무엇입니까?

I am on Laravel Homestead version '3.0.2' 
Laravel 5.2.45 
+0

[보기는'__toString()'] (https://laravel.com/api/4.2/Illuminate/View/View.html#method___toString)을 구현합니다. 이것이 이유인지는 모르겠지만 Laravel이이를 호출하는 문자열 컨텍스트에서 View를 사용하는지 확인하는 것이 좋습니다. – Gordon

+0

은보기를 문자열로 변환하는 방법으로 __toString()을 구현합니다. 뷰 객체의 기본값. 보기가 블레이드 템플릿으로 올바르게 템플릿 화되었는지 확인해야합니다. – Aschab

+0

예보기 구현 __toString()을 구현했으나 응답 객체는보기로 문자열을 캐스팅하여 "content"속성으로 설정해야합니다. 응답 객체의 "original"속성 항상 원래 뷰 객체 여야합니다. –

답변

1

나는이 동일한 문제에 부딪쳤다. 필자의 경우 응답이 준비되었을 때 응답이 View 객체를 수신하는 것으로 밝혀졌지만 반환되기 전에 응답을 처리 한 "후"미들웨어 클래스 중 하나는 View 객체를 문자열로 변환하는 것이 었습니다.

우연히 genealabs/laravel-caffeine 패키지를 사용하고 있습니까? 그것은 내 문제를 일으킨 미들웨어였습니다. 테스트 환경에 등록되지 않도록 패키지를 설정함으로써이 문제를 해결할 수있었습니다.