【发布时间】:2017-07-17 20:18:35
【问题描述】:
简述
在Flask-SqlAlchemy中测试模型类时,如何mock方法.query.filter_by(),从而返回mocked模型对象列表?
详细信息
假设我们有一个模型类,如下代码
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class SomeModel(db.Model):
# more column mapping and methods go here
然后在我们的 Flask 代码中调用
SomeModel.query.filter_by(...)
在我们的测试代码中,使用带有mocking 的Python unittest 模型,我们希望模拟filter_by() 调用,以便它返回我们设计的测试用例下的模型对象列表。
我们怎样才能做到这一点?
附言
我的谷歌搜索只找到this related post;虽然在课程开始时应用@patch("flask_sqlalchemy.SignallingSession", autospec=True) 对我不起作用。
我也尝试将函数模拟为如下代码 sn-p
@patch('app.model.some_model.SomeModel.query.filter_by')
def test_some_case(self, filterbyMOCK):
# more test logic goes here
并且代码在启动时立即出错
RuntimeError: application not registered on db instance and no application bound to current context
来自 PyCharm IDE 的完整错误截图如下。
Traceback (most recent call last):
File "/home/namgivu/NN/code/someproject-cloud/venv/local/lib/python2.7/site-packages/mock/mock.py", line 1297, in patched
arg = patching.__enter__()
File "/home/namgivu/NN/code/someproject-cloud/venv/local/lib/python2.7/site-packages/mock/mock.py", line 1353, in __enter__
self.target = self.getter()
File "/home/namgivu/NN/code/someproject-cloud/venv/local/lib/python2.7/site-packages/mock/mock.py", line 1523, in <lambda>
getter = lambda: _importer(target)
File "/home/namgivu/NN/code/someproject-cloud/venv/local/lib/python2.7/site-packages/mock/mock.py", line 1210, in _importer
thing = _dot_lookup(thing, comp, import_path)
File "/home/namgivu/NN/code/someproject-cloud/venv/local/lib/python2.7/site-packages/mock/mock.py", line 1197, in _dot_lookup
return getattr(thing, comp)
File "/home/namgivu/NN/code/someproject-cloud/venv/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 428, in __get__
return type.query_class(mapper, session=self.sa.session())
File "/home/namgivu/NN/code/someproject-cloud/venv/local/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py", line 78, in __call__
return self.registry()
File "/home/namgivu/NN/code/someproject-cloud/venv/local/lib/python2.7/site-packages/sqlalchemy/util/_collections.py", line 990, in __call__
return self.registry.setdefault(key, self.createfunc())
File "/home/namgivu/NN/code/someproject-cloud/venv/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 136, in __init__
self.app = db.get_app()
File "/home/namgivu/NN/code/someproject-cloud/venv/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py", line 809, in get_app
raise RuntimeError('application not registered on db '
RuntimeError: application not registered on db instance and no application bound to current context
【问题讨论】:
-
请将您的回溯发布为文本。屏幕截图不能被屏幕阅读器索引或阅读,我们也不能复制细节来检查给定部分的代码究竟是什么样的。
-
@MartijnPieters 谢谢。它使用 PasteBin 进行更新
-
请不要粘贴链接。问题需要独立存在,请在此处发布回溯。
-
跟踪@MartijnPieters 太长怎么样?
-
在 Python 中,只有在遇到无限递归问题时才会发生这种情况。然后你可以剪掉重复的部分。
标签: python flask sqlalchemy mocking python-unittest