在Laravel 4单元测试中,如何在请求中设置cookie?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Laravel 4单元测试中,如何在请求中设置cookie?相关的知识,希望对你有一定的参考价值。

在我的Laravel 4应用程序中,我希望测试特定端点是否在请求中检测并正确响应cookie。因此,在我的单元测试中,我希望在请求中设置一个cookie,然后对响应执行标准断言。

我在单元测试中的调用形式如下:

$response = $this->client->request($method, $endpoint, $params, $files, $server);

我已经为$method$endpoint$params和空$files$server指定了正确的值。

我尝试了很多变化,将cookie值放在$params$server的各种键下,但到目前为止,没有运气看到cookie出现在控制器Cookie:get('myname)下。

如何在单元测试中在请求中设置名称为“myname”且值为“myvalue”的cookie?

更新:

我想我可以简单地在请求中添加一个标题:

Cookie: myname=myvalue

但我必须相信有更多类似Laravel的方式。

更新2:

以上都行不通。

答案

看起来我们可以在扩展IlluminateFoundationTestingTestCase的测试中执行以下操作:

$this->client->getCookieJar()->set(
    new SymfonyComponentBrowserKitCookie('myname', 'myvalue')
);

然后,cookie将通过标准在控制器中公开:

$cookie = Cookie::get('myname'); // $cookie gets 'myvalue'

(通过Laravel.io

另一答案

我对需要非常相似的功能进行了测试,我使用$ this-> call()函数进行了测试

$this->call($method, $url, $parameters = [], $cookies = [“name”=> IlluminateSupportFacadesCrypt::encryptString(”Leonardo”)], $files = [], $server = [], $content = null);

如果您需要了解更多或更少的工作方式,请查看此文件:

Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php
另一答案

编辑:这只适用于大草原5.2或更大

您可以使用Documentation for TestCase中显示的call()方法设置Cookie

我最近用过类似的东西。这是一个例子:

$cookies = ['cookie_name' => 'cookie_value'];
$response = $this->call("get", 'target/url/for/request', [], $cookies);

这是Laravel Framework Github上的additional issue thread,有人对如何调用它有些困惑。这进一步巩固了我的知识。希望这可以帮助!

编辑:

laravel丢弃的cookie似乎无法解密。警惕这一点。 Here is a Link遇到了这个问题。

他们建议的解决方案(如果此链接死亡):

似乎问题是cookie加密。 Laravel将删除无法解密的cookie。由于测试cookie不是由laravel创建的(我只是使用一个数组来测试cookie,如上一篇文章所示),它们没有加密,它们将被删除。我可以想到两个解决这个问题的方法。

  1. 只需从app / Http / Kernel.php列表中删除cookie中间件即可。所有cookie将按原样发送到客户端并从客户端接收。如果您不需要加密,或者您想在客户端读取一些cookie,这是一个很好的解决方案。
  2. 编辑中间件,以便在测试期间不会加密或解密cookie。只需添加一个代码来处理检查环境的功能,并在环境测试时继续执行任何操作。此中间件位于Illuminate / Cookie / Middleware / EncryptCookie.php中。因此,框架更新将撤消此文件中的编辑。如果您需要加密,这是您唯一的解决方案。
另一答案

你必须把cookie变量与返回响应放在一起然后才能工作

代码看起来像

$ response-> withCookie(cookie('name','value',$ minutes));

返回$ response;

以上是关于在Laravel 4单元测试中,如何在请求中设置cookie?的主要内容,如果未能解决你的问题,请参考以下文章

在laravel测试中设置会话ID

在 Laravel 中设置 PHPUnit 测试

如何在 Xcode 4.5“命令行工具”项目中设置工作逻辑单元测试目标?

如何在 Swift 中设置单元测试?

如何测试在视图控制器单元测试中设置私有变量的方法?

如何在Vuejs单元测试中设置或测试。$ parent?