在进行Laravel功能测试时,通常我们会使用$this->postJson()系列方法来测试接口。一般情况下,通过$this->actingAs()方法即可解决登录状态的问题。然而,某些特殊情况下,我们需要向cookie中添加token以保持登录状态。
一开始,我尝试了以下代码:
$header = ['Set-Cookie: token=abc123'];
但发现这并不能实现预期的效果。于是我尝试了另一种方式:
$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()。跟踪进去后发现,该方法会判断属性$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,即可实现预期的效果。文章来源:https://www.toymoban.com/diary/laravel/569.html
希望这篇文章对你在Laravel功能测试中设置请求cookie时有所帮助!文章来源地址https://www.toymoban.com/diary/laravel/569.html
到此这篇关于如何在Laravel功能测试中设置请求Cookie?解决方法详解的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!