python - 尝试修补或猴子修补 Flask API 中调用的函数时的路径问题
问题描述
我正在尝试为 Flask 应用程序构建一些测试,并且我正在努力让一些模拟/修补按预期工作。
尽管花时间阅读/思考有关在哪里进行修补的文档,但它们的行为都没有@patch
或monkeypatch
看起来不像我预期的那样,我正在努力看看我做错了什么。
在 Flaskapi.py
文件中,我有一个简单的登录 API,用于检查身份验证要求(在其他地方定义并如图所示导入):
from project_name.api.auth import login_auth
@api.route('/v1/login', methods=['POST'])
data = request.get_json()
username = data['Username']
password = data['Password']
if not login_auth(username, password):
raise APIError('Invalid Username or Password')
...
我有兴趣修补这个login_auth
功能,这样我就可以在没有真实用户名/密码的情况下进行测试。
在我的 pytest 文件中,我尝试使用补丁和猴子补丁来解决这个问题。
@patch
方法:
@patch('project_name.api.auth.login_auth')
def test_login(mock_login_auth, client):
mock_login_auth.return_value = True
mimetype = 'application/json'
headers = {
'Content-Type': mimetype,
'Accept': mimetype
}
data = {
'Username': "test_user",
'Password': "test_password",
}
url = 'api/v1/login'
assert project_name.api.auth.login_auth('x', 'y') == True
response = client.post(url, data=json.dumps(data), headers=headers)
assert response.status_code == 200
如果我运行这个测试,那么直接调用修补函数的第一个断言语句将按预期工作,但是 API 调用将不会使用模拟login_auth
函数,并且测试将不符合此标准。
monkeypatch
方法:
def test_login2(client, monkeypatch):
monkeypatch.setattr("project_name.api.auth.login_auth", lambda x, y: True)
mimetype = 'application/json'
headers = {
'Content-Type': mimetype,
'Accept': mimetype
}
data = {
'Username': "test_user",
'Password': "test_password",
}
url = 'api/v1/login'
assert project_name.api.auth.login_auth('x', 'y') == True
response = client.post(url, data=json.dumps(data), headers=headers)
assert response.status_code == 200
再一次,我看到第一个断言直接调用该函数,并按预期进行了修补,但在对 API 的请求之后调用的函数尚未修补,因此第二assert
条语句的测试将失败。
我尝试了许多不同的方法,包括尝试修补login_auth
路径project_name.api.login_auth
(假设我正在尝试修补导入到文件中的特定 login_auth 函数api.py
),但我不清楚正确的方法。
鉴于我正在使用 Flask 的 test_client 方法,我想知道是否需要做一些具体的事情,或者我是否还缺少其他东西。
解决方案
这里的问题是api.py
您正在导入模块的功能
from project_name.api.auth import login_auth
并且名称空间似乎需要匹配,因此作为解决方法,您可以导入整个模块并使用完整的名称空间调用函数:
if not project_name.api.auth.login_auth(username, password):
您也可以看看这个其他问题: 使用 python mock 模拟函数
推荐阅读
- php - PHP MySQL 大数据集有大量时间显示在角度组件和从数据库导出的小 csv 文件中
- makefile - CMake 将环境变量传递给 ExternalProject_Add
- vim - 为什么 vim 不在任何寄存器中存储 `daw`-ed 文本
- security - HTTPS 证书和 Kubernetes (EKS)
- java - javax.persistence.RollbackException:在 JPA 代码中提交事务时出错
- android - 我们应该什么时候开始将 Fabric 的 Crashlytics 迁移到 Firebase Crashlytics?
- sql - 查询 SSAS 以查找表是否在多维数据集中使用
- javascript - XPages CSJS 被执行,而 SSJS 不被执行
- bokeh - 可以像 Pandas DataFrame 一样一次性绘制 Bokeh ColumnDataSource 吗?
- python - 'numpy.ndarray' 对象在 Ipython 控制台中不可调用