我想发送一个带有json POST的cookie:
public function testAccessCookie()
{
$response = $this->json('POST', route('publications'))->withCookie(Cookie::create('test'));
//some asserts
}
发布路由有一些中间件:
public function handle($request, Closure $next)
{
Log::debug('cookie', [$request->cookies]);
//cookie validation
return $next($request);
}
但在运行testAccessCookie()
时,日志中有[null]
。没有附加cookies。
怎么了?
对于真实的(浏览器内)请求就没有这样的问题。
发布于 2019-02-05 14:24:54
您可以将cookies添加到测试中的调用:
$cookies = ['test' => 'value'];
$response = $this->call('POST', route('publications'), [], $cookies);
但是,您将遇到cookie加密问题。您可以在测试期间临时禁用cookies:
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响应。
发布于 2019-11-13 06:59:02
这应该可以在最近的版本(Laravel 6)中工作:
以下任一项:
$this->disableCookieEncryption();
或者:
$cookies = ['test' => encrypt('value', false)];
$response = $this->call('POST', route('publications'), [], $cookies);
发布于 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做的实现,它应该也能在早期版本上工作。
<?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);
}
}
https://stackoverflow.com/questions/54064280
复制相似问题