0

我的任务是向应用程序添加单元测试,我发现自己需要帮助来设置数据库查询的模拟。

我们有一个模型:

class Category(db.Model):
__tablename__ = "category"

id = db.Column(db.Integer, primary_key=True)
company_id = db.Column(db.Integer, db.ForeignKey("company.id"))
name = db.Column(db.String(150))
modified = db.Column(db.DateTime(), default=datetime.datetime.utcnow())
status = db.Column(db.Integer)
image = db.Column(db.String(120))
color = db.Column(db.String(20))

old_category_id = db.Column(db.Integer, default=-1)

还有一个类 PBCategory 有一堆方法,但我们从第一个开始

class PBCategory:

@classmethod
def list_of_categories(cls, user, select_deleted=False):
    """
    List of categories for the users company
    :param user: User making the request
    :type user: modules.pb_auth.PBAuthUser
    :param select_deleted: Also return deleted categories
    :return: List of Category objects
    :rtype: list of collections.namedtuple
    """

    query = Category.query.filter(Category.company_id == user.company_id)
    if not select_deleted:
        query = query.filter(Category.status == constants.CATEGORY_ACTIVE)

    return query.order_by(Category.name.asc()).all()

在我的conftest中,我有以下固定装置:

@pytest.fixture
def mock_client():
    #Setup mock application
    app_mock = Flask(__name__)
    db = SQLAlchemy(app_mock)
    db.init_app(app_mock)
    return app_mock

@pytest.fixture
def mock_get_sqlalchemy(mocker):
    mock = mocker.patch("flask_sqlalchemy._QueryProperty.__get__").return_value = mocker.MagicMock()
    return mock

@pytest.fixture(scope='module')
def list_of_categories():
    categories = []

    for x in range(5):
        new_category = Category(
            company_id=1,
            name='test category' + str(x),
            status=constants.CATEGORY_ACTIVE
        )
        categories.append(new_category)

    return categories

这是我们尝试运行的第一个测试:

def test_list_categories(
        mock_client,
        mock_get_sqlalchemy,
        list_of_categories,
        new_user
):
    with mock_client.app_context():
        mock_get_sqlalchemy().order_by = list_of_categories
        print(list_of_categories)
        results = PBCategory.list_of_categories(new_user, False)

    print(results)

    assert len(results) > 0

问题是,无论我如何格式化调用签名(return_value.order_by、return_value.order_by.return_value.all 等),我都会收到以下错误:

>       assert len(results) > 0
E       AssertionError: assert 0 > 0
E        +  where 0 = len(<MagicMock name='__get__().filter().filter().order_by().all()' id='140592881056736'>)

tests/unit_tests/modules/test_pb_category.py:27: AssertionError

我看过这个问题,但它并没有让我走得太远...... 如何在 Flask-SqlAlchemy 中模拟 <ModelClass>.query.filter_by()

任何帮助将不胜感激。

4

0 回答 0