在Laravel中测试多个Auth

时间:2018-02-13 14:23:14

标签: laravel testing

在我的应用中,我使用多重身份验证。 (我使用this link

它有效,我可以用户身份登录 - >我被重定向到“/ home”

作为管理员,当我登录时,我被重定向到“/ admin_home”

连接后,管理员无法访问“/ home”,他被重定向到另一个页面

但是当我写这个测试时:

class AdminTest extends TestCase
{
    public function setUp()
    {
        parent::setUp();
        Artisan::call('migrate');
        Artisan::call('db:seed');
    }

    public function tearDown()
    {
        Artisan::call('migrate:reset');
        parent::tearDown();
    }


    public function testCannotAccessUserSpace()
    {
        $admin = Admin::find(1);

        $response = $this->actingAs($admin, 'admin')
            ->get('/home');

        $response->assertStatus(200);
    }

}

我有成功的回复,但我知道管理员无法访问“主页”空间

我的测试出了什么问题?

1 个答案:

答案 0 :(得分:4)

好的,经过一番努力,我终于找到了问题。

我使用相同的link实现了多次验证。

问题出在HomeController.php而不是AdminTest

就像您在AdminController.php构造函数中指定了身份验证后卫一样,您也必须在HomeController.php中执行此操作。

如您所知(假设您已按照链接) AdminController.php ,就像这样:

class AdminController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:admin');
    }

在这里,我们在构造函数中指定我们需要对admin后卫进行身份验证,但在HomeController中我们没有。

HomeController.php之前:

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

HomeController.php之后:

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:web');
    }

解决方案

  

$这 - >中间件( 'AUTH');

更改为

  

$这 - >中间件( 'AUTH:网络');

现在,如果您运行测试,它将显示以下错误:

PHPUnit 5.7.27 by Sebastian Bergmann and contributors.

F..                                                                 3 / 3 (100%)

Time: 124 ms, Memory: 10.00MB

There was 1 failure:

1) Tests\Feature\AdminTest::testCannotAccessUserSpace
Expected status code 200 but received 302.
Failed asserting that false is true.