在進行Laravel功能測試時,通常我們會使用$this->postJson()系列方法來測試接口。一般情況下,通過$this->actingAs()方法即可解決登錄狀態(tài)的問題。然而,某些特殊情況下,我們需要向cookie中添加token以保持登錄狀態(tài)。
一開始,我嘗試了以下代碼:
$header = ['Set-Cookie: token=abc123'];
但發(fā)現這并不能實現預期的效果。于是我嘗試了另一種方式:
$header = ['Set-Cookie' => 'token=abc123'];
不過,這次也沒有成功。只能進一步閱讀源碼,在Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php的522行找到了以下代碼片段:
return $this->call( $method, $uri, [], $this->prepareCookiesForJsonRequest(), $files, $this->transformHeadersToServerVars($headers), $content );
倒數第二個參數引起了我的注意,transformHeadersToServerVars()?原來,$header最終會被轉換為$_SERVER中的數據。這樣的話,使用它來傳遞cookie是行不通的。
接著,我注意到第四個參數prepareCookiesForJsonRequest()。跟蹤進去后發(fā)現,該方法會判斷屬性$this->withCredentials是否為true,如果不是則返回空數組。而這個屬性默認值為false。
為了解決傳遞cookie的問題,我需要將$this->withCredentials設置為true。通過調用withCredentials()方法可以實現:
$this->withCredentials();
傳遞cookie的問題解決了,但是如何設置cookie呢?接下來,我直接在這個類中搜索關鍵詞"cookie",很快就找到了withUnencryptedCookie()方法。由于項目并沒有使用Laravel自帶的cookie加密功能,所以我決定使用該方法來設置cookie。
最后一次嘗試,果然實現了我想要的效果:
$this->withUnencryptedCookie('cookie_name', $cookieValue) ->withCredentials();
通過以上步驟,我們成功地在Laravel功能測試中設置了請求的cookie。使用withUnencryptedCookie()方法設置cookie的名稱和值,同時調用withCredentials()方法設置屬性$this->withCredentials為true,即可實現預期的效果。文章來源:http://www.zghlxwxcb.cn/article/569.html
希望這篇文章對你在Laravel功能測試中設置請求cookie時有所幫助!文章來源地址http://www.zghlxwxcb.cn/article/569.html
到此這篇關于如何在Laravel功能測試中設置請求Cookie?解決方法詳解的文章就介紹到這了,更多相關內容可以在右上角搜索或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!