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



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

护照目前在Lumen中的设置方式,特别是对于网络请求,我们伪造了对Passport的内部请求,并将客户端ID和密钥存储在后端的环境文件中。(客户端机密在 .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));
}
}

无论如何,这个类在我们的开发环境中工作得很好。它处理请求并像它应该的那样分发访问令牌/刷新令牌。

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

因此,我已经切换到在单元测试中使用$this->call()而不是测试 PassportOauth 类来伪造对 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(有没有更好的方法来对此进行单元测试?到目前为止,我的方法给了我很多悲伤。

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

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

最新更新