【问题标题】:how do I best unit test Passport in a CI/CD pipeline?如何在 CI/CD 管道中对 Passport 进行最佳单元测试?
【发布时间】:2020-04-11 05:04:08
【问题描述】:

所以我正在尝试为我们的新身份验证服务器在 Lumen 上实现 Passport 编写一些单元/功能测试。但是,我遇到了很多烦人的问题,我什至不确定我是否会以正确的方式做这件事。

当前在 Lumen 中设置护照的方式,特别是对于 Web 请求,我们伪造对 Passport 的内部请求,并将客户端 ID 和机密存储在后端的 env 文件中。 (客户端密码是硬编码在 .env 中的,所以它总是通过每台开发机器上的播种机使用相同的 ID 和密码创建)下面是代码:

class PassportOauth
{
    const OAUTH_LOGIN = '/api/v1/oauth/token';

    /**
     *  Functions to encapsulate the token request (login) needs
     *  */
    public static function login($username, $password)
    {
        return self::clientLogin($username, $password, env('CLIENT_ID'), env('CLIENT_SECRET'));
    }

    public static function clientLogin($username, $password, $clientID, $clientSecret)
    {
        return self::post(self::OAUTH_LOGIN, [
            'grant_type' => 'password',
            'client_id'  => $clientID,
            'client_secret' => $clientSecret,
            'username' => $username,
            'password' => $password
        ]);
    }

    private static function post($url, $data)
    {
        return app()->handle(Request::create($url, 'POST', $data));
    }
}

无论如何,这个类在我们的开发环境中非常棒。它处理请求并按预期分发访问令牌/刷新令牌。

但是,当我运行单元测试测试这个类时,我不断收到错误“不支持授予类型”,尽管单元测试数据库中存在密码客户端并且所有环境变量都存在。

因此,我已经切换到而不是测试 PassportOauth 类,而是在单元测试中使用 $this->call() 来伪造对 Passport 的调用:

private function doLogin($email, $password)
{
    return json_decode($this->call('POST', self::OAUTH_LOGIN, [
        'grant_type' => 'password',
        'client_id' => env('CLIENT_ID'),
        'client_secret' => env('CLIENT_SECRET'),
        'username' => $email,
        'password' => $password
    ])->getContent());
}

这对开发很有用!单元测试通过和一切。但是,当它们在我们的 ci/cd 管道中运行并运行单元测试时,我收到未安装 oauth 公钥/私钥的错误。这很明显,我只需要运行passport:install 对吗?

问题是,当时没有在管道中创建护照数据库表。而且我不确定每次运行 ci/cd 管道时是否要添加创建数据库迁移。

所以我的问题是:

1) 我是否以正确的方式接近这一点?如果我是,我如何绕过我什至不需要的 oauth 私钥/公钥,因为我已经从我的 env 文件中的硬编码值静态创建了密码客户端?

2) 是否有更好的方法对此进行单元测试?到目前为止,我的做法让我很伤心。

【问题讨论】:

    标签: php unit-testing oauth lumen laravel-passport


    【解决方案1】:

    是的,测试它的方法是不尝试对其进行单元测试。你想要的是集成测试。

    您可以像普通客户端一样直接调用身份验证服务器,您将获得一个令牌,然后开始进行其他测试,令牌正常时会发生什么,它过期时会发生什么,当您拥有令牌时会发生什么您的资源服务器等的错误令牌。

    【讨论】:

      猜你喜欢
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多