如何使用 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 中间件的用户?