2017-05-27 121 views
0

我試圖測試一些中間件,檢查用戶是否具有Laravel 5.4/PHPUnit的x角色。角色功能在瀏覽器工作正常,但我似乎無法讓我的測試通過(我得到403的預期與某人沒有所需的角色),用下面的代碼:Laravel 5.4 - 集成測試角色中間件失敗

public function testSuperAdminRoleRoute() 
{ 
    $admin = factory(User::class)->create(); 
    $adminRole = \HttpOz\Roles\Models\Role::whereSlug('super.admin')->first(); 

    $admin->detachAllRoles(); 
    $admin->attachRole($adminRole); 

    $response = $this->actingAs($admin) 
        ->get('/super-admin-only') 
        ->assertStatus(200); 
} 

當我dd($admin->roles)我確實看到了正確的角色,但我認爲我錯過了Laravel/PHPUnit中的一些限制。我以前在驗收測試中測試了這種功能,並使其工作。

任何意見是非常感謝!

回答

0

在與軟件包作者(httoz)交談後,我們認爲這是由於Laravel的be()actingAs()方法的限制。我們並不十分確定爲什麼,但我相信會話起作用,並且PHPUnit使用一個數組作爲會話存儲,所以我推動了這一點。

我試圖使用$this->disableMiddleware(),但因爲我在我的視圖中使用了$error包(並且這是通過中間件設置的),所以我的測試500因爲$errors未定義。

然而,閱讀Laravel 5.5本次擬變更:https://github.com/laravel/framework/pull/18673

我複製從推代碼:

public function withoutMiddleware($middleware = null) 
{ 
    if (is_null($middleware)) { 
     $this->app->instance('middleware.disable', true); 
     return $this; 
    } 
    $nullMiddleware = new class { 
     public function handle($request, $next) 
     { 
      return $next($request); 
     } 
    }; 
    foreach ((array) $middleware as $abstract) { 
     $this->app->instance($abstract, $nullMiddleware); 
    } 
    return $this; 
} 

,並設置我的$this->withoutMiddleware()調用更新,以這樣的:

$this->withoutMiddleware([ 
    \HttpOz\Roles\Middleware\VerifyRole::class, 
    \HttpOz\Roles\Middleware\VerifyGroup::class 
]); 

我又變綠了!