如何最好地在CI / CD管道中对Passport进行单元测试?

时间:2019-12-18 15:42:03

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

因此,我正在尝试为新的身份验证服务器编写一些在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));
    }
}

无论如何,该类在我们的开发环境中有效 great 。它可以处理请求,并按照预期方式分发访问令牌/刷新令牌。

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

因此,我改用而不是测试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私钥/公钥?

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

1 个答案:

答案 0 :(得分:0)

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

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