【问题标题】:How to logout within one test in Laravel testing?如何在 Laravel 测试中的一项测试中注销?
【发布时间】:2019-04-10 20:20:09
【问题描述】:

Laravel v5.7.1

我有多个具有相同断言的测试,并希望将它们移动到一个函数中并从测试中调用它。下面是函数示例:

private function admin_only($url, $method = 'GET', $data = []) {
    // \Auth::logout();
    $response = $this->json($method, $url, $data);
    $response->assertStatus(401);
    $response = $this->actingAs($this->user(),'api')->json($method, $url, $data);
    $response->assertStatus(403);

    $response = $this->actingAs($this->admin(),'api')->json($method, $url, $data);
    $response->assertStatus(200);
}

在此我首先检查未经身份验证的用户,一切都按预期工作,但是有一些函数,API 调用会切换某些状态,所以我想通过第二次调用函数来恢复它:

$this->admin_only('/api/service/toggle-state', 'POST', $data);
$this->admin_only('/api/service/toggle-state', 'POST', $data);

第二次调用相同的测试导致失败,因为第一个 $this->json() 用作管理员并返回成功代码。

\Auth::logout() 应该解决问题,但却抛出错误 BadMethodCallException: Method Illuminate\Auth\RequestGuard::logout does not exist.

诸如“第二次通话单独测试”、“无切换还原”、“非管理员用户和访客的响应代码相同”之类的解决方案应该可以工作,但对我来说似乎是错误的。

【问题讨论】:

  • 您是否尝试将Authuse Illuminate\Support\Facades\Auth; 一起使用,然后在没有\ 的情况下使用Auth::logout()
  • 刚刚试了一下,还是一样的错误。

标签: laravel unit-testing


【解决方案1】:

幸运的是RequestGuardMacroable,所以我们可以用我们自己的方法扩展它。尝试执行以下操作:

use Illuminate\Auth\RequestGuard;

// ...

RequestGuard::macro('logout', function() {
    $this->user = null;
});

$this->app['auth']->guard('api')->logout(); // or omit `->guard('api')` part

这与->actingAs 的做法相反。以下所有请求都将没有经过身份验证的用户。

这可以作为方法添加到基础测试类中,然后用作$this->actingAsGuest() 或类似的东西。无论如何,在 Laravel 中默认设置它会很方便。

【讨论】:

  • 应该是公认的答案。你也可以使用Auth门面来注销
  • @andrewtweber 为我使用 Auth 外观会导致 sam 错误。
【解决方案2】:

可能你有不同的警卫>>所以这可能有效

Auth::guard('admin')->logout();

您可以将 'admin' 更改为任何守卫名称

【讨论】:

  • 不幸的是,它没有。我有 2 个用于身份验证的默认 laravel 守卫,这是 api 一个 ['middleware' => ['auth:api']\Auth::guard('api')->logout(); 抛出同样的错误
猜你喜欢
  • 2022-06-21
  • 2022-07-02
  • 2019-09-28
  • 2019-05-09
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多