如何在Laravel测试前设置cookie?

时间:2016-05-25 15:34:15

标签: testing cookies laravel-5 phpunit

我需要根据cookie的存在来测试特定的行为,如何在发送请求(或访问页面)之前设置cookie?目前,以下情况失败,表现为没有任何设置。

$this->actingAs($user)
       ->withSession(['user' => $user, 'profile' => $profile]) ;
@setcookie( 'locale_lc', "fr", time() + 60 * 60 * 24 * 900, '/', "domain.com", true, true) ;
$this->visit('/profile') ;

或者

$cookie = ['locale_lc' => Crypt::encrypt('fr')] ;

$this->actingAs($user)
         ->withSession(['user' => $user, 'profile' => $profile])
         ->makeRequest('GET', '/profile', [], $cookie) ;

1 个答案:

答案 0 :(得分:0)

问题在于设置和阅读cookie。 @setcookie$_COOKIE都不会在测试环境中起作用。带有cookie数组的方法makeRequest是正确的。

然而!

阅读脚本(控制器,中间件)必须使用Laravel的$request->cookie()方法,而不是直接尝试使用$_COOKIE访问它。在我的情况下,cookie需要由我们域上的另一个应用程序读取,因此我还必须禁用该特定cookie的加密,这可以在EncryptCookies.php

中完成

<强> EncryptCookies

<?php

protected $except = [
        'locale_lc'
    ];

测试

<?php

$cookie = ['locale_lc' => 'fr'] ;

$this->actingAs($user)
         ->withSession(['user' => $user, 'profile' => $profile])
         ->makeRequest('GET', '/profile', [], $cookie) ;

<强>中间件

<?php

public function handle($request, Closure $next){
  if($request->cookie('locale_lc')){...}
}