【问题标题】:How to assert unauthenticated?如何断言未经身份验证?
【发布时间】:2020-08-17 19:50:27
【问题描述】:

在我的控制器构造函数中,我有中间件身份验证。我如何断言某人在测试中没有经过身份验证?现在我得到 Illuminate\Auth\AuthenticationException 并且使测试呈阳性的唯一方法是添加

$this->expectException('Illuminate\Auth\AuthenticationException')

在一开始。我看到了在测试开始时使用 withoutExceptionHandling() 或使用 assertUnauthorized() 之类的解决方案,但这并没有改变任何东西。

有没有更好的办法?

我正在使用 Laravel 7.2.2 和 PHPUnit 8.5。

【问题讨论】:

  • 检查 401/403 响应代码。
  • 显示一些代码,Laravel 中的一般特性测试不会抛出异常
  • 也尝试过 assertStatus 401/403 但它没有帮助。看起来在异常之后它不会读取任何代码。 $reply = create('App\Reply'); $this->delete('replies/' . $reply->id); Create 是一个辅助函数,它可以创建一个回复和一个线程。
  • 你还没有显示一些代码,当我们看不到整个测试时很难帮助
  • 这两行是完整的测试。

标签: php laravel unit-testing phpunit laravel-7


【解决方案1】:

试试$this->deleteJson('replies/' . $reply->id);。它将返回 json 响应而不是抛出异常。然后你可以拨打->assertStatus(401);就可以了

【讨论】:

  • 仍然抛出 Illuminate\Auth\AuthenticationException 但非常感谢您的回复
【解决方案2】:
/** @test */
public function unauthenticated_user_cannot_access_protected_routes()
{
    $this->withoutExceptionHandling();

    $this->expectException('Illuminate\Auth\AuthenticationException');

    $this->getJson('/api/user'); //This route is protected with auth:api
}

【讨论】:

    【解决方案3】:
    $this->get('/routeThatRequiresAuthentication');
    
    $this->assertGuest();
    

    【讨论】:

      【解决方案4】:

      在 Laravel 中,您可以使用 auth() 辅助方法来获取当前经过身份验证的用户,如下所示。如果没有找到经过身份验证的用户,它将返回 null。这就是您可以断言检查未经身份验证的内容。

      $this->assertNull(auth()->user());
      

      我相信这也会起作用:

      $this->assertFalse(auth()->check());
      

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,including an explanation 将帮助人们理解你的代码建议的原因。
      猜你喜欢
      • 1970-01-01
      • 2019-06-14
      • 2023-03-10
      • 2019-09-25
      • 1970-01-01
      • 2015-10-12
      • 2016-02-06
      • 2015-05-19
      • 2018-08-03
      相关资源
      最近更新 更多