Php Laravel测试路由授权、中间件授权问题

Php Laravel测试路由授权、中间件授权问题,php,laravel,testing,phpunit,laravel-5.6,Php,Laravel,Testing,Phpunit,Laravel 5.6,请容忍我,我是测试新手 因此,我有一个目前的中间产品结构: class IsActive { public function handle($request, Closure $next) { if (self::active()) { return $next($request); } Auth::guard('web')->logout(); return redirect('/')

请容忍我,我是测试新手

因此,我有一个目前的中间产品结构:

class IsActive
{
    public function handle($request, Closure $next)
    {
        if (self::active()) {
            return $next($request);
        }
        Auth::guard('web')->logout();
        return redirect('/');
    }

    protected function active()
    {
        if (Auth::guard('web')->check()) {
            $state = Auth::guard('web')->user()->state;
            if ($state == 'enabled') {
                return true;
            }
        }
        return false;
    }
}

class IsAdmin extends IsActive
{
    public function handle($request, Closure $next)
    {
        if (parent::active()) {
            if (Auth::guard('web')->check()) {
                $role = Auth::guard('web')->user()->role->name;
                if ($role == 'admin' || $role == 'superAdmin') {
                    return $next($request);
                }
            }
            return redirect('/');
        }
        Auth::guard('web')->logout();
        return redirect('/');
    }
}
这是路线

Route::group(['middleware' => 'admin'], function () {
    Route::get('/', 'ReportingController@reportingPage');
});
//Its registered on RouteServiceProvider that these routes require IsActive and this specific route needs for the admin
在报告控制器中,我得到了这个函数

public function reportingPage(Request $request) {
    return view('reporting.reporting');
}
到目前为止还不错。如果用户有访问权限,很好,否则会被重定向

现在,为了测试,我想验证管理员是否可以查看它(而未经授权的管理员则不能,但对于这个问题,我试图找出管理员)

这就是我所遇到的错误,我正试图弄清楚过程是什么。很明显,我做错了什么,或者忘记了什么,所以非常感谢关于如何测试此授权的提示和想法

编辑:


在经过一些重构和尝试之后,我确定
Auth::guard('web')->user()
有一个用户,
Auth::guard('web')->user()->role()
在测试环境中为空。我已经通过加载关系解决了这个问题,但我现在的问题是:为什么在测试环境中会发生这种情况。

我已经稍微更改了您的代码。删除了重复的代码,并为用户角色添加了延迟急切加载
$user->load('role')
。试试看

class IsAdmin
{
    public function handle($request, Closure $next)
    {
        //no need to check active again, because you said IsActive is already applied in RouteServiceProvider
        $user = Auth::guard('web')->user();

        $user->load('role'); //lazy eager load

        $role = $user->role->name; 

        if ($role == 'admin' || $role == 'superAdmin') {
            return $next($request);
        }

        Auth::guard('web')->logout();
        return redirect('/');
    }
}
可能创建的用户(模拟)未在$this上下文中使用

如果您查看文档,就会看到方法

$this->actingAs($user)
完整示例:

<?php

use App\User;

class ExampleTest extends TestCase
{
    public function testApplication()
    {
        $user = factory(User::class)->create();

        $response = $this->actingAs($user)
                         ->withSession(['foo' => 'bar'])
                         ->get('/');
    }
}

您检查过了吗,您是否在那里获得了
$user
实例?同时检查我是否有渴望加载
角色
。试着把它打印出来。我已经在编辑中确定了问题所在,我正在寻找发生这种情况的原因的答案。你应该创建这样的假关系
$user=factory(user::class)->create()$post=工厂(post::class)->创建(['user\u id'=>$user->id])您正在创建用户,然后将该用户设置为会话用户。当我们创建用户时,它不会加载关系。创建用户后,如果加载user$user=user::find(1);然后将其设置为会话用户,然后可以访问它Auth::user()->角色。或者将其加载为惰性急切加载
Auth::user()->load('role')
<?php

use App\User;

class ExampleTest extends TestCase
{
    public function testApplication()
    {
        $user = factory(User::class)->create();

        $response = $this->actingAs($user)
                         ->withSession(['foo' => 'bar'])
                         ->get('/');
    }
}