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

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

原文链接:learnku.com/laravel/t/4
讨论请前往专业的 Laravel 开发者论坛:learnku.com/Laravel

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

在项目中使用并运行 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);
}

下一步

既然您已经可以进行对需要身份验证的接口进行自动化测试的基本框架,那么在构建项目时就可以轻松添加测试了。

希望这篇文章对您有所帮助!

原文链接:learnku.com/laravel/t/4
讨论请前往专业的 Laravel 开发者论坛:learnku.com/Laravel
发布于 04-17

文章被以下专栏收录