Laravel 5.8单元测试模拟Cookie遇阻:方法未定义且取值为null
Laravel 5.8尚未引入withCookie()方法,直接使用call()传Cookie数组或withHeaders()传Cookie头时,因框架默认的Cookie加密机制,会导致获取值为null,可通过以下两种方式解决:
方法一:传递加密后的Cookie值
直接传明文Cookie会触发解密失败返回null,需先加密Cookie值再传入:
// 加密目标Cookie值 $encryptedValue = $this->app['encrypter']->encrypt('cookie_value'); // 方式1:用call方法传递 $this->call('GET', route('offer.create'), [], ['cookie_name' => $encryptedValue]); // 方式2:用withHeaders传递 $this->withHeaders([ 'Cookie' => "cookie_name={$encryptedValue}" ])->get(route('offer.create'));
完成后即可通过$request->cookie('cookie_name')正常获取到Cookie值。
方法二:临时关闭测试环境的Cookie加密
若不想每次手动加密,可修改测试环境的config/session.php配置,将encrypt选项设为false:
'encrypt' => false,
修改后直接传递明文Cookie即可生效:
$this->call('GET', route('offer.create'), [], ['cookie_name' => 'cookie_value']);
注意:此设置会影响所有测试用例的Cookie加密状态,测试完成后建议恢复原配置。
另外,Cookie::get('cookie_name')依赖当前请求上下文,需确保在请求发起后的代码块中调用该方法,否则也会返回null。
内容的提问来源于stack exchange,提问作者Tayyab Hanif
相关产品推荐
相关产品推荐

