我的任务是向应用程序添加单元测试,我发现自己需要帮助来设置数据库查询的模拟。
我们有一个模型:
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()
任何帮助将不胜感激。