因此,我正在尝试为新的身份验证服务器编写一些在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)是否有更好的方法对此进行单元测试?到目前为止,我的方法给了我很多悲伤。
答案 0 :(得分:0)
是的,测试此方法的方法是不尝试对其进行单元测试。您想要的是集成测试。
您将像普通客户端一样直接调用身份验证服务器,您将获得令牌,然后开始进行其他测试,令牌正常时会发生什么,令牌到期时会发生什么,拥有令牌时会发生什么您的资源服务器等使用了错误的令牌。