如何使用 API 中间件在 Laravel 中测试 PHPUnit 一个经过身份验证的用户?

Posted

技术标签:

【中文标题】如何使用 API 中间件在 Laravel 中测试 PHPUnit 一个经过身份验证的用户?【英文标题】:How to test PHPUnit an authenticated user on Laravel with API middelware? 【发布时间】:2020-04-19 21:23:23 【问题描述】:

我正在尝试测试需要经过身份验证的用户的路由和端点,但我遇到了一些麻烦。 ¿如何在我的测试功能中登录用户?

我的数据库模型不是 Eloquent-Model。 我正在使用 phpUnit 进行测试

端点

Route::middleware('auth:api')->get('/myroute', 'MyController@MyFunction');

CONTROLLER(在前端可以正常工作):

public function MyFunction()

  $loggedUser= auth()->user()->getAuthIdentifier();
  $results= $this->myUsecase->execute(new myCommand(new UserId($loggedUser)));
  return $this->response($this->serializer, $results);

测试

function testMyControllerCanSendResults()

    $response = $this->get('/api/myroute');
    $response->assertOk();

此测试失败,因为应用程序要求经过身份验证的用户在 Usecase 中使用他的标识符。

我尝试为“Usuario”模型制作自定义 Fake Factory(但我遇到了问题,因为我的“Usuario”模型不是 Eloquent 模型。

我可以尝试什么? 非常感谢!!!

【问题讨论】:

你在使用 Laravel Passport 吗? @Saly3301 没有。我正在使用自定义守卫:'custom' => ['driver' => 'database', 'model' => Usuario::class, 'table' => 'users', ], 你在config/auth.php注册了要被api使用的自定义守卫吗? 是 @Saly3301 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], //////////// ///// 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'custom', ], 'api' => [ 'driver' => 'token ', '提供者' => '自定义', '哈希' => false, ], ], 如果你的驱动是database那么你不能使用'model' => Usuario::class, 【参考方案1】:
/** @test */
public function unauthenticated_user_cannot_access_protected_routes()

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

    $this->getJson('/api/user');

【讨论】:

【参考方案2】:

@Saly3301

这是我的“登录”功能:

public function doLogin(Request $request)

    $username = $request->input('username');
    $password = $request->input('password');
    if (Auth::guard('web')->attempt(['user' => $username, 'password' => $password])) 

        $user = Auth::user();

        $respuesta['api_token'] = Auth::User()->api_token;
        $respuesta['id'] = Auth::User()->id;
        $respuesta['rol'] = Auth::User()->rol;
        $respuesta['status'] = 200;
        return $this->response($this->serializer, $respuesta);

     else 
        $respuesta['status'] = 400;
        return $this->response($this->serializer, $respuesta);
    



一旦用户登录,'api' 中间件就可以正常工作(我在来自前端的请求中使用了 api_token - 它是一个 React-admin 前端)

【讨论】:

以上是关于如何使用 API 中间件在 Laravel 中测试 PHPUnit 一个经过身份验证的用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.3 中验证没有 auth:api 中间件的用户?

如何使用中间件来授权我的 laravel Restful API

Laravel Cors 中间件不适用于 POST 请求

如何使用 CSRF 令牌发布到 Laravel API?

使用 API 时如何组织 laravel 控制器 [关闭]

使用 Laravel Passport 范围进行单元测试