env是在配置文件中使用的;在其他代码文件中不要直接使用env;请使用配置文件
比如你可以这样操作:
在 config/app 文件中是这样
'env' => env('APP_ENV', 'production'),
在其他地方判断环境变量
config('app.env') == 'production'
如果执行了
artisan config:cache
,那么.env
将不会被加载看着不爽,建议封装个
isLocal()
方法
env是在配置文件中使用的;在其他代码文件中不要直接使用env;请使用配置文件
比如你可以这样操作:
在 config/app 文件中是这样
'env' => env('APP_ENV', 'production'),
在其他地方判断环境变量
config('app.env') == 'production'
如果执行了
artisan config:cache
,那么.env
将不会被加载看着不爽,建议封装个
isLocal()
方法
结贴结贴
感谢各位大佬的帮忙!
感谢 @pikalu 、 @panda-sir 、 @pigzzz 、 @lyxxxh 、 @萧潇 、 @di-gua 、 @咸鸭蛋 、 @Wi1dcard 、 @graybit (不分先后)
记录一下我的最终解决方案:
前提:
为了偷懒,不在每个unit方法中加登录验证的代码。最初就是用本文所提问的一样。用env来拿环境变量判断;但最终被pass,后面从之前的一个帖子里:问答:Laravel 在做 Unit 测试时, 如何跳过中间件?
看到@fangmuke 大佬说的:
所以还是去从每个方法都登录的方向找办法;
最终发现在:\Illuminate\Foundation\Testing\TestCase
中发现方法setUp
会调用 \Tests\CreatesApplication
类里的createApplication
方法,所以决定在方法:createApplication
做手脚:
public function createApplication()
{
$app = require __DIR__.'/../bootstrap/app.php';
$app->make(Kernel::class)->bootstrap();
$app->alias(NullLogger::class, 'log');
Auth::attempt([
'email' => 'xxxxxx',
'password' => 'xxxxxx',
]);
return $app;
}
即在每次unit方法运行之前都模拟登录一次,拿到session。继而正常走过auth中间件;
如此的话,不管是本地环境,还是测试环境,又或是gitlab的CI打包环境,都不会有被拦截的问题;
我试了下 在createApplication
方法写好像跟在类的setUp
方法写没啥区别
我现在跟你一样也是每次调用单元测试都模拟登陆 但我这边应要求把jwt token
存储在后端redis
了
每次我都要在tearDown
方法内调用logout方法清除
这样太麻烦了 我试过把protected $token
改成静态的 在setUp
方法内判断为空才去login
但没办法在tearDown
方法内判断是不是最后一个单元测试方法
你有没有好点的解决方法@goudan
如果执行了
artisan config:cache
,那么.env
将不会被加载看着不爽,建议封装个
isLocal()
方法