首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel单元测试-将cookie添加到请求?

Laravel单元测试-将cookie添加到请求?
EN

Stack Overflow用户
提问于 2019-01-07 01:48:36
回答 3查看 3.9K关注 0票数 3

我想发送一个带有json POST的cookie:

代码语言:javascript
运行
复制
public function testAccessCookie()
{
    $response = $this->json('POST', route('publications'))->withCookie(Cookie::create('test'));
    //some asserts
}

发布路由有一些中间件:

代码语言:javascript
运行
复制
public function handle($request, Closure $next)
{
    Log::debug('cookie', [$request->cookies]);

    //cookie validation

    return $next($request);
}

但在运行testAccessCookie()时,日志中有[null]。没有附加cookies。

怎么了?

对于真实的(浏览器内)请求就没有这样的问题。

EN

回答 3

Stack Overflow用户

发布于 2019-02-05 14:24:54

您可以将cookies添加到测试中的调用:

代码语言:javascript
运行
复制
$cookies = ['test' => 'value'];

$response = $this->call('POST', route('publications'), [], $cookies);

请参阅https://laravel.com/api/5.4/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.html#method_call

但是,您将遇到cookie加密问题。您可以在测试期间临时禁用cookies:

代码语言:javascript
运行
复制
use Illuminate\Cookie\Middleware\EncryptCookies;

/**
 * @param array|string $cookies
 * @return $this
 */
protected function disableCookiesEncryption($name)
{
    $this->app->resolving(EncryptCookies::class,
        function ($object) use ($name)
        {
          $object->disableFor($name);
        });

    return $this;
}

在测试开始时添加$this->disableCookiesEncryption('test');

您可能需要添加标头来指定json响应。

票数 5
EN

Stack Overflow用户

发布于 2019-11-13 06:59:02

这应该可以在最近的版本(Laravel 6)中工作:

以下任一项:

代码语言:javascript
运行
复制
$this->disableCookieEncryption();

或者:

代码语言:javascript
运行
复制
$cookies = ['test' => encrypt('value', false)];

$response = $this->call('POST', route('publications'), [], $cookies);
票数 2
EN

Stack Overflow用户

发布于 2020-11-23 23:54:13

从Laravel 5.2开始,您将获得默认在web中间件组中定义的\App\Http\Middleware\EncryptCookies::class中间件,它会将所有未加密的cookies设置为空。

不幸的是,您在单元测试中使用$request->call()$request->get()$request->post()发送的所有cookies通常都是未加密的,官方文档中没有任何内容告诉您需要对它们进行加密。

如果您不想每次都调用$request->disableCookieEncryption(),作为永久解决方案,您可以简单地在App\Http\Middleware\EncryptCookies.php中重新定义isDisabled()方法,以便在单元测试期间忽略cookies加密。

这是我为Laravel 6.x做的实现,它应该也能在早期版本上工作。

代码语言:javascript
运行
复制
<?php

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;

class EncryptCookies extends Middleware
{
    /**
     * The names of the cookies that should not be encrypted.
     *
     * @var array
     */
    protected $except = [
        //
    ];

    public function isDisabled($name)
    {
        if (app()->runningUnitTests()) {
            return true;    // Disable cookies encryption/decryption during unit testing
        }

        return parent::isDisabled($name);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54064280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档