首页 > 解决方案 > 如何在 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

但我没能做到。

标签: pythonunit-testingflasksqlalchemy

解决方案


如果您想验证是否所有过滤器都在那里,您可以通过使您的代码可测试来做到这一点

def get_filters():
    return [Organization.organization_name == 'xyz', Organization.property2 == 'abc', ]

然后验证 get_filters() 的输出

在实际查询中,您可以传递过滤器的输出,例如

filters = get_filters()
session.query.filter(*filters)

我建议不要使用模拟 ORM 方法,因为这会使它们复杂化。相反,使代码可测试。


推荐阅读