2015-10-01 54 views
0

考慮以下測試:Laravel 5.1不允許您在網址參數傳遞(有配置)

public function it_should_contain_a_list_of_investors_who_belong_to_one_or_more_investment() { 
    $this->createInvestment(); 

    $investor = factory(User::class)->create([ 
     'role_id' => 4 
    ]); 

    $response = $this->actingAs($investor) 
        ->call('GET', 'api/v1/investors?include=investments'); 

    dd(json_decode($response->getContent())); 
    $this->assertNotEmpty(json_decode($response->getContent())); 
} 

現在考慮下面的動作本次測試致電:

public function getAllInvestorsForCompany($slug) 
{ 
    $users = $this->investorEntity->usersForCompany($slug); 

    $resource = new Collection($users, new InvestorTransformer, 'investor'); 
    dd($_GET); 
    if (isset($_GET['include'])) { 
     $usersData = $this->manager->parseIncludes($_GET['include'])->createData($resource)->toArray(); 
    } else { 
     $usersData = $this->manager->createData($resource)->toArray(); 
    } 

    return response()->json($usersData); 
} 

dd$_GET返回[]

讓我們在瀏覽器中做相同的測試:

array:1 [▼ 
    "include" => "investments.offering.company" 
] 

好了,所以在瀏覽器中我回去investments.offering.company,因爲這是我傳遞的?include=但在測試中它像laravel忽略?包括和移動上。

這是laravel 5.1測試的默認行爲,如果是這樣,我該如何關閉它?

+0

'$ _GET'在控制檯請求期間不會被填充,因爲您的控制檯應用程序實際上沒有_make_請求。它改爲通過應用程序運行請求的操作 –

回答

1

call的第三個參數是參數。

$response = $this->actingAs($investor) 
    ->call('GET', 'api/v1/investors', ['include' => 'investments']); 
2

請勿在Laravel控制器中使用$_GET,$_POST$_REQUEST。您應該使用Request門面:

public function getAllInvestorsForCompany($slug) 
{ 
    $users = $this->investorEntity->usersForCompany($slug); 

    $resource = new Collection($users, new InvestorTransformer, 'investor'); 

    if (Request::input('include')) { 
     $usersData = $this->manager->parseIncludes(Request::input('include'))->createData($resource)->toArray(); 
    } else { 
     $usersData = $this->manager->createData($resource)->toArray(); 
    } 

    return response()->json($usersData); 
} 

測試時,Laravel不實際上使HTTP調用 - 它創建了一個Request對象,然後通過該到路由控制器,這就是爲什麼這些變量不是活得實際上可用。

使用Request facade還允許您執行諸如設置默認值(如果輸入不存在)並處理多個輸入表單(如在請求正文中將JSON發送爲數據的AngularJS,而不是POST或GET參數)。

+0

那麼,如何使用Request對象設置'?include ='? – TheWebs

+0

只需按照原樣發送網址即可。 'Request'對象將解析查詢字符串並自動將其變爲參數。它在內部使用'Symfony'中的'Request'對象,然後在頂部添加一些額外的功能。請參閱[Symfony源代碼](https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/HttpFoundation/Request.php#L308) – samlev

+0

您也可以發送關聯數組或參數作爲您的調用'方法中的第三項,並且將優先於查詢字符串中傳遞的任何內容,但兩者都可以正常工作。 – samlev