相关疑难解决方法(0)

Python SQLAlchemy - 模拟模型属性的"desc"方法

在我的应用程序中,每个模型都有一个类来保存常用的查询(我猜它在某种程度上是DDD语言中的"存储库").这些类中的每一个都传递给SQLAlchemy会话对象,以便在构造时创建查询.我在确定在单元测试中运行某些查询的最佳方法时遇到了一些困难.使用无处不在的博客示例,假设我有一个"Post"模型,其中包含列和属性"date"和"content".我还有一个"PostRepository",其方法是"find_latest",它应该按"日期"降序查询所有帖子.它看起来像:

from myapp.models import Post

class PostRepository(object):
    def __init__(self, session):
        self._s = session

    def find_latest(self):
        return self._s.query(Post).order_by(Post.date.desc())
Run Code Online (Sandbox Code Playgroud)

我在模拟Post.date.desc()调用时遇到了麻烦.现在我在单元测试中为Post.date.desc修补了一个模拟,但我觉得可能有更好的方法.

编辑:我正在使用mox作为模拟对象,我当前的单元测试看起来像:

import unittest
import mox

class TestPostRepository(unittest.TestCase):

    def setUp(self):
        self._mox = mox.Mox()

    def _create_session_mock(self):
        from sqlalchemy.orm.session import Session
        return self._mox.CreateMock(Session)

    def _create_query_mock(self):
        from sqlalchemy.orm.query import Query
        return self._mox.CreateMock(Query)

    def _create_desc_mock(self):
        from myapp.models import Post
        return self._mox.CreateMock(Post.date.desc)

    def test_find_latest(self):
        from myapp.models.repositories import PostRepository
        from myapp.models import Post

        expected_result = 'test'

        session_mock = self._create_session_mock()
        query_mock = self._create_query_mock()
        desc_mock = self._create_desc_mock()

        # Monkey patch
        tmp …
Run Code Online (Sandbox Code Playgroud)

python unit-testing sqlalchemy mocking mox

7
推荐指数
1
解决办法
1万
查看次数

标签 统计

mocking ×1

mox ×1

python ×1

sqlalchemy ×1

unit-testing ×1