模拟flask单元测试的令牌-firebase admin python SDK

模拟flask单元测试的令牌-firebase admin python SDK,python,firebase,firebase-authentication,firebase-admin,Python,Firebase,Firebase Authentication,Firebase Admin,我正在使用firebase admin python SDK处理iOS应用程序和flask后端(python)之间的身份验证。这是我的后端身份验证终结点,如下所示: 如何模拟单元测试的fir_令牌?如何也模拟身份验证。验证\u id\u令牌,这样我就不需要实际连接到firebase服务器了?将逻辑放在接口后面 class TokenVerifier(object): def verify(self, token): raise NotImplementedError()

我正在使用firebase admin python SDK处理iOS应用程序和flask后端(python)之间的身份验证。这是我的后端身份验证终结点,如下所示:


如何模拟单元测试的fir_令牌?如何也模拟身份验证。验证\u id\u令牌,这样我就不需要实际连接到firebase服务器了?

将逻辑放在接口后面

class TokenVerifier(object):
    def verify(self, token):
        raise NotImplementedError()


class FirebaseTokenVerifier(TokenVerifier):
    def verify(self, token):
        return auth.verify_id_token(token)


class MockTokenVerifier(TokenVerifier):
    def verify(self, token):
         # Return mock object that will help pass your tests.
         # Or raise an error to simulate token validation failures.
然后确保在单元测试期间,您的代码使用
MockTokenVerifier


还可以创建模拟ID令牌,并删除管理SDK的部分内容,以便在测试期间正常运行
auth.verify\u ID\u token()
(请参阅SDK的第页)。但我更喜欢上面的解决方案,因为它更简单、更干净,而且不需要弄乱SDK的内部结构。

我使用
unittest.mock
库中的
补丁
装饰程序实现了这一点

auth.py

。。。
来自flask_restful导入资源,reqparse
从firebase_管理导入验证
类令牌(资源):
定义初始化(自):
self.parser=reqparse.RequestParser()
self.parser.add_参数('token',type=str,required=True)
#/api/auth/token的路由
def post(自我):
args=self.parser.parse_args()
尝试:
firebase_user=auth.verify_id_令牌(args['token'])
除例外情况外:
中止(401)
#使用firebase_用户
测试验证副本

从unittest导入模拟
模拟\u firebase\u用户={
“用户id”:“firebasegenerateduserid”,
“电子邮件”:testuser@gmail.com',
#…添加更多firebase返回值
}
#客户端来自conftest.py
def测试认证(客户端):
使用mock.patch('auth.auth.verify\u id\u token')作为magic\u mock:
magic\u mock.return\u value=mock\u firebase\u用户
post_数据={
“令牌”:“firebaserusertokenid”
}
response=client.post('/api/auth/token',data=post_data)
assert response.status_code==200

此解决方案是否意味着我需要在
解码\u令牌=auth.verify\u id\u令牌(fir\u令牌)
之前使用
if config[“TESTING”]==True:
来切换
验证器
?我不知道
配置
是什么。一般来说,在测试期间如何交换验证器实际上取决于您。我建议以某种方式构造代码,这样就可以设置一些模块或类级属性来指定验证器。理想情况下,在
get()
请求处理程序中不必有条件。
class TokenVerifier(object):
    def verify(self, token):
        raise NotImplementedError()


class FirebaseTokenVerifier(TokenVerifier):
    def verify(self, token):
        return auth.verify_id_token(token)


class MockTokenVerifier(TokenVerifier):
    def verify(self, token):
         # Return mock object that will help pass your tests.
         # Or raise an error to simulate token validation failures.