如何测试使用了 jwt-auth 的 Laravel API ?

Laravel

使用优秀的 jwt-auth 库,可以相对轻松地使用 Laravel 进行 JWT 身份验证,该库位于https://github.com/tymondesigns/jwt-auth

在项目中使用并运行 JWT 后,您可能要开始考虑怎么构建测试了?

我会在本文中采用如下三步处理:

  1. 创建一个默认的 API 用户并在 config 中设置详细信息
  2. 添加 token 测试
  3. 使用 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://dev.to/adam_crampton/testing-lar...

译文地址:https://learnku.com/laravel/t/43000

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1

发现一篇不错的博客,希望可以由社区翻译。
https://driesvints.com/blog/the-beauty-of-...

4年前 评论
zxdstyle 4年前
leslieeilsel (作者) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!