python - 如何在 Flaks-SqlAlchemy 中模拟多个 query.filter_by
问题描述
简单来说
在 Flask-SqlAlchemy 中进行测试时,如何模拟多个不同的 query.filter_by().first ?
更详细
我按照这个链接进行了一些单元测试,当我只有一个 query.filter_by 时它工作得很好。
问题在于我拥有的一个功能:
user = User.query.filter_by(username=user["username"]).first()
organization = Organization.query.filter_by(organization_name=user.get("organization")).first()
如果我这样做时遵循上一个链接:
@mock.patch('flask_sqlalchemy._QueryProperty.__get__')
def test(self, queryMOCK):
queryMOCK \
.return_value.filter_by \
.return_value.first \
.return_value = user
我模拟了所有的 query.filter_by() 而不仅仅是两者之一。
他们说要做:
@patch('app.model.some_model.SomeModel')
def test_some_case(self, some_model_mock):
filter_by_mock = some_model_mock.query.filter_by
但我没能做到。
解决方案
如果您想验证是否所有过滤器都在那里,您可以通过使您的代码可测试来做到这一点
def get_filters():
return [Organization.organization_name == 'xyz', Organization.property2 == 'abc', ]
然后验证 get_filters() 的输出
在实际查询中,您可以传递过滤器的输出,例如
filters = get_filters()
session.query.filter(*filters)
我建议不要使用模拟 ORM 方法,因为这会使它们复杂化。相反,使代码可测试。
推荐阅读
- javascript - 如果提交了某个值,如何更改输入 type="text" 中占位符文本的颜色?
- javascript - 如何更改我的代码以在 javascript 中生成方格板?
- azure - Azure 事件中心服务
- java - 如何使用java在打开的资源管理器窗口中选择文件
- javascript - 从另一个事件目标中删除事件侦听器
- python - 如何解决Python中线性程序的多种解决方案?
- python-3.x - Cython 初始化内存视图的最快方法
- css - 每个浏览器是否对每个 HTML 元素都有自己的默认 CSS?
- python - Python 代码无法读取设置的环境变量
- css - Tailwind CSS 样式在生产中被移除