【问题标题】:How to mock multiple query.filter_by in Flaks-SqlAlchemy如何在 Flask-SqlAlchemy 中模拟多个 query.filter_by
【发布时间】:2021-06-03 08:29:20
【问题描述】:

简述

在 Flask-SqlAlchemy 中进行测试时,如何模拟多个不同的 query.filter_by().first ?

更详细

我跟着 this link 做了一些单元测试,当我只有一个 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

但我没能做到。

【问题讨论】:

  • 您要测试过滤条件还是整个查询?
  • 无,我有一个同时使用这两个查询的函数,我想分别模拟这两个查询。

标签: python unit-testing flask sqlalchemy


【解决方案1】:

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

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

然后验证get_filters()的输出

在实际查询中,然后可以将filter的输出如

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

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

【讨论】:

    猜你喜欢
    • 2017-07-17
    • 2014-09-21
    • 2020-01-02
    • 2013-03-25
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多