python query.filter函数_如何在Flask SqlAlchemy中模拟.query.filter_by()

简言之

在Flask SqlAlchemy中测试模型类时,如何模拟方法.query.filter_by(),以便返回模拟模型对象的列表?

全部细节

假设我们有一个如下代码所示的模型类from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class SomeModel(db.Model):

# more column mapping and methods go here

然后在我们的烧瓶代码中我们调用SomeModel.query.filter_by(...)

在我们的测试代码中,将Python unittest模型与mocking一起使用,我们希望模拟filter_by()调用,以便它在我们设计的测试用例下返回模型对象列表。

我们怎么才能做到?

附则

我的google搜索只找到了this related post;尽管在类的开头应用@patch("flask_sqlalchemy.SignallingSession", autospec=True)对我不起作用。

我还尝试将函数模拟为下面的代码片段@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

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


版权声明:本文为weixin_28785681原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。