久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

如何在 Flask-SqlAlchemy 中模擬 <ModelClass&g

How to mock lt;ModelClassgt;.query.filter_by() in Flask-SqlAlchemy(如何在 Flask-SqlAlchemy 中模擬 lt;ModelClassgt;.query.filter_by())
本文介紹了如何在 Flask-SqlAlchemy 中模擬 <ModelClass>.query.filter_by()的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

在Flask-SqlAlchemy中測試模型類時,如何mock方法.query.filter_by()以返回mocked模型對象列表?

When testing a model class in Flask-SqlAlchemy, how can we mock the method .query.filter_by() so as to return the list of mocked model objects?

假設我們有一個模型類,如下代碼

Let's say we have a model class as below code

from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class SomeModel(db.Model):
    # more column mapping and methods go here

然后在我們的 Flask 代碼中調用

Then in our Flask code we call

SomeModel.query.filter_by(...)

在我們的測試代碼中,使用 Python unittest 模型和 mocking,我們要模擬 filter_by() 調用,以便它返回我們設計的測試用例下的模型對象列表.

In our testing code, using Python unittest model with mocking, we want to mock the filter_by() call so that it returns a list of model objects under our designed test case.

我們怎樣才能做到這一點?

How can we get to that?

附言

我的谷歌搜索只找到這篇相關帖子;雖然在課程開始時應用 @patch("flask_sqlalchemy.SignallingSession", autospec=True) 對我不起作用.

My google search only found this related post; though applying @patch("flask_sqlalchemy.SignallingSession", autospec=True) at the beginning of the class not work for me.

我還嘗試將函數模擬如下代碼片段

I also tried to mock the function as below code snippet

@patch('app.model.some_model.SomeModel.query.filter_by')
def test_some_case(self, filterbyMOCK):
    # more test logic goes here

并且代碼在啟動時立即出錯

and the code get immediate error when started

RuntimeError: application not registered on db instance and no application bound to current context

來自 PyCharm IDE 的完整錯誤截圖如下.

The full error from PyCharm IDE as snapshot below.

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

推薦答案

你必須模擬整個映射器類;訪問映射器上的 query 屬性會導致會話加載:

You'll have to mock the whole mapper class; accessing the query attribute on the mapper causes a session load:

@patch('app.model.some_model.SomeModel')
def test_some_case(self, some_model_mock):
    filter_by_mock = some_model_mock.query.filter_by
    # more test logic goes here

那是因為 .query 屬性是一個描述符對象;訪問它會觸發與會話的綁定.

That's because the .query attribute is a descriptor object; accessing it triggers the binding to a session.

替代方法是模擬 _QueryProperty.__get__ 方法(支持 .query 屬性);僅當您必須使用實際的 SomeModel 實例進行測試時才使用它:

The alternative would be to mock out the _QueryProperty.__get__ method (which backs the .query attribute); only use this if you must test with actual SomeModel instances:

@patch('flask_sqlalchemy._QueryProperty.__get__')
def test_some_case(self, query_property_getter_mock):
    filter_by_mock = query_property_getter_mock.return_value.filter_by
    # more test logic goes here

演示:

>>> from flask_sqlalchemy import SQLAlchemy
>>> db = SQLAlchemy()
>>> class SomeModel(db.Model):
...     id = db.Column(db.Integer, primary_key=True)
...
>>> from unittest import mock
>>> with mock.patch('__main__.SomeModel') as model_mock:
...     filter_by = model_mock.query.filter_by
...     SomeModel.query.filter_by(SomeModel.id == 'foo')
...
<MagicMock name='SomeModel.query.filter_by()' id='4438980312'>
>>> with mock.patch('flask_sqlalchemy._QueryProperty.__get__') as query_property_getter_mock:
...     filter_by_mock = query_property_getter_mock.return_value.filter_by
...     SomeModel.query.filter_by(SomeModel.id == 'foo')
...
<MagicMock name='__get__().filter_by()' id='4439035184'>

這篇關于如何在 Flask-SqlAlchemy 中模擬 &lt;ModelClass&gt;.query.filter_by()的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

How should I verify a log message when testing Python code under nose?(在鼻子下測試 Python 代碼時,我應該如何驗證日志消息?)
Patch __call__ of a function(修補函數的 __call__)
How to call self in a mock method of an object in Python?(如何在 Python 中對象的模擬方法中調用 self?)
Mocking only a single method on an object(僅模擬對象上的單個方法)
Mocking a subprocess call in Python(在 Python 中模擬子進程調用)
Checking call order across multiple mocks(檢查多個模擬的調用順序)
主站蜘蛛池模板: 成人做受黄大片 | 青青草免费在线观看视频 | 双性呜呜宫交受不住了h | 一级理论片 | 国产精品成人免费精品自在线观看 | 青青草国产在线视频 | 狠狠干天天 | 五月天激情国产综合婷婷婷 | 亚洲精品18在线观看 | 亚洲精品在线观看视频 | 国产精品伦一区二区三级视频 | 欧美视频精品 | 一级二级片 | 成人免费在线视频 | 欧美午夜精品久久久久免费视 | 一区二区免费看 | 日韩高清国产一区在线 | 日韩精品一 | 激情网五月天 | 日韩黄色在线观看 | 久久在线精品 | 玖玖精品在线 | 在线观看日韩精品 | 天天色天天色 | 天天操夜夜摸 | 亚洲欧美视频在线观看 | 久青草影院 | 天天色播 | 欧美日韩亚洲一区 | 欧美日韩激情视频 | 日本成人一区二区 | 久久靖品 | 国产全肉乱妇杂乱视频 | 综合伊人 | 免费一级黄色录像 | 亚洲国产精品久久久久 | 国产精品入口66mio男同 | 国产网址 | 久操福利 | 亚洲视频一区二区三区 | 中文字幕av在线 |