Laravel以不同的用户身份运行测试

时间:2015-12-18 16:07:10

标签: php unit-testing laravel

我正在使用Laravel 5.1,我正在尝试测试我的控制器。

我为不同的操作定义的用户和策略有多个角色。首先,每个请求都需要由经过身份验证的用户进行,因此运行没有用户的测试会按预期返回401 Unauthorized。

但是当我想测试授权用户的功能时,我仍然会收到401 Unauthorized状态代码。

值得一提的是,我在这些控制器上使用了基本的无状态HTTP身份验证。

我尝试了以下内容:

public function testViewAllUsersAsAdmin()
{
    $user = UserRepositoryTest::createTestAdmin();

    Auth::login($user);

    $response = $this->call('GET', route('users.index'));
    $this->assertEquals($response->getStatusCode(), Response::HTTP_OK);
}

public function testViewAllUsersAsAdmin()
{
    $user = UserRepositoryTest::createTestAdmin();

    $response = $this->actingAs($user)
        ->call('GET', route('users.index'));

    $this->assertEquals($response->getStatusCode(), Response::HTTP_OK);
}

还有这个(如果我的新用户有任何问题,那就不应该)

public function testViewAllUsersAsAdmin()
{
    $user = User::find(1);

    $response = $this->actingAs($user)
        ->call('GET', route('users.index'));

    $this->assertEquals($response->getStatusCode(), Response::HTTP_OK);
}

但是在每种情况下我都得到一个401响应代码,所以我的测试失败了。

当以虚拟用户身份登录时,我可以使用邮递员访问路线。

我的想法已经不多了,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

通过一些实验,我发现问题存在于我的身份验证中间件中。由于我希望API是无状态的,因此身份验证如下所示:

public function handle($request, Closure $next)
{
    return Auth::onceBasic() ?: $next($request);
}

显然,用我的方式验证用户是不可能的。

我的解决方案只是在每次测试开始时使用WithoutMiddleware特征或$this->withoutMiddleware()来禁用中间件。