2016-05-25 16 views
3

我需要基於cookie的存在來測試特定的行爲,在發送請求(或訪問頁面)之前如何設置cookie?目前下面的失敗,它的行爲喜歡沒有設置。如何在Laravel測試之前設置cookie?

$this->actingAs($user) 
     ->withSession(['user' => $user, 'profile' => $profile]) ; 
@setcookie('locale_lc', "fr", time() + 60 * 60 * 24 * 900, '/', "domain.com", true, true) ; 
$this->visit('/profile') ; 

或者

$cookie = ['locale_lc' => Crypt::encrypt('fr')] ; 

$this->actingAs($user) 
     ->withSession(['user' => $user, 'profile' => $profile]) 
     ->makeRequest('GET', '/profile', [], $cookie) ; 

回答

0

的問題是在設置和餅乾的閱讀。 @setcookie$_COOKIE都不能在測試環境下工作。使用cookie數組的方法makeRequest是正確的。

但是!

閱讀腳本(控制器,中間件)必須使用Laravel的$request->cookie()方法,而不是直接嘗試使用$_COOKIE訪問它。在我的情況下的cookie需要通過我們的域的其他應用讀取,所以我也不得不禁用加密特定的cookie,它可以在EncryptCookies.php

EncryptCookies

<?php 

protected $except = [ 
     'locale_lc' 
    ]; 

測試完成

<?php 

$cookie = ['locale_lc' => 'fr'] ; 

$this->actingAs($user) 
     ->withSession(['user' => $user, 'profile' => $profile]) 
     ->makeRequest('GET', '/profile', [], $cookie) ; 

中間件

<?php 

public function handle($request, Closure $next){ 
    if($request->cookie('locale_lc')){...} 
} 
+0

如果你還沒有禁用加密,這仍然有效嗎? – Flimm

相關問題