如何测试使用了 jwt-auth 的 Laravel API ?
使用优秀的 jwt-auth
库,可以相对轻松地使用 Laravel
进行 JWT
身份验证,该库位于https://github.com/tymondesigns/jwt-auth
在项目中使用并运行 JWT
后,您可能要开始考虑怎么构建测试了?
我会在本文中采用如下三步处理:
- 创建一个默认的 API 用户并在 config 中设置详细信息
- 添加 token 测试
- 使用 token 身份验证为项目测试
通过这些测试后,您可以确保在受保护的接口上发行、刷新和使用 token。
1. 设置一个默认的 API
用户
虽然您可以使用工厂来自动执行此操作,但有时有必要使用预先保存的凭据来测试身份验证。
为此,我们可以创建一个默认的User
模型(手动或使用 seeder
),并将电子邮件和密码存储在.env
文件中。
使.env变量在测试中可用的最佳方法是创建配置文件(e.g. app\config\api.php
):
/*
|--------------------------------------------------------------------------
| API 特定配置
|--------------------------------------------------------------------------
*/
return [
// Default API user - mostly used for tests.
'apiEmail' => env('API_USER_EMAIL'),
'apiPassword' => env('API_USER_PASSWORD')
];
2. 测试有身份验证的路由
我们可以在此处测试的三个功能点是登录,注销和刷新。 确保我们可以:
- 生成 token
- 注销请求中携带 token
- token 无痛刷新
登录
使用默认用户的凭据(电子邮件和密码)访问登录路由,并获取 token 。
为了确保获得正确的响应,我们需要声明 200 HTTP状态检查和 JSON 响应中的3个必需字段。
/**
* 以默认 API 用户身份登录并获取令牌。
*
* @return void
*/
public function testLogin()
{
$baseUrl = Config::get('app.url') . '/api/auth/login';
$email = Config::get('api.apiEmail');
$password = Config::get('api.apiPassword');
$response = $this->json('POST', $baseUrl . '/', [
'email' => $email,
'password' => $password
]);
$response
->assertStatus(200)
->assertJsonStructure([
'access_token', 'token_type', 'expires_in'
]);
}
注销
现在,我们可以使用登录测试中获取的令牌来请求注销操作。
由于我已经在 AuthController 中的注销方法返回了固定的消息,因此我们可以设置返回消息必须完全匹配。
注意: 要成功生成 token,记得引入 Tymon\JWTAuth\Facades\JWTAuth
。
/**
* Test logout.
*
* @return void
*/
public function testLogout()
{
$user = User::where('email', Config::get('api.apiEmail'))->first();
$token = JWTAuth::fromUser($user);
$baseUrl = Config::get('app.url') . '/api/auth/logout?token=' . $token;
$response = $this->json('POST', $baseUrl, []);
$response
->assertStatus(200)
->assertExactJson([
'message' => 'Successfully logged out'
]);
}
刷新 token
最后,我们为默认用户刷新 token
/**
* Test token refresh.
*
* @return void
*/
public function testRefresh()
{
$user = User::where('email', Config::get('api.apiEmail'))->first();
$token = JWTAuth::fromUser($user);
$baseUrl = Config::get('app.url') . '/api/auth/refresh?token=' . $token;
$response = $this->json('POST', $baseUrl, []);
$response
->assertStatus(200)
->assertJsonStructure([
'access_token', 'token_type', 'expires_in'
]);
}
3. 测试功能点
现在可以确定 token生成正常了,然后使用默认的 API 用户对 JWT 保护的接口进行身份验证。
这个示例中,我们从 User 模型中获取所有数据:
/**
* Get all users.
*
* @return void
*/
public function testGetUsers()
{
$user = User::where('email', Config::get('api.apiEmail'))->first();
$token = JWTAuth::fromUser($user);
$baseUrl = Config::get('app.url') . '/api/users?token=' . $token;
$response = $this->json('GET', $baseUrl . '/', []);
$response->assertStatus(200);
}
下一步
既然您已经可以进行对需要身份验证的接口进行自动化测试的基本框架,那么在构建项目时就可以轻松添加测试了。
希望这篇文章对您有所帮助!
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
发现一篇不错的博客,希望可以由社区翻译。
https://driesvints.com/blog/the-beauty-of-...