久久久久久久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()的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

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

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?

假設(shè)我們有一個(gè)模型類,如下代碼

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 代碼中調(diào)用

Then in our Flask code we call

SomeModel.query.filter_by(...)

在我們的測(cè)試代碼中,使用 Python unittest 模型和 mocking,我們要模擬 filter_by() 調(diào)用,以便它返回我們?cè)O(shè)計(jì)的測(cè)試用例下的模型對(duì)象列表.

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.

我們?cè)鯓硬拍茏龅竭@一點(diǎn)?

How can we get to that?

附言

我的谷歌搜索只找到這篇相關(guān)帖子;雖然在課程開(kāi)始時(shí)應(yīng)用 @patch("flask_sqlalchemy.SignallingSession", autospec=True) 對(duì)我不起作用.

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.

我還嘗試將函數(shù)模擬如下代碼片段

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

并且代碼在啟動(dòng)時(shí)立即出錯(cuò)

and the code get immediate error when started

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

來(lái)自 PyCharm IDE 的完整錯(cuò)誤截圖如下.

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

推薦答案

你必須模擬整個(gè)映射器類;訪問(wèn)映射器上的 query 屬性會(huì)導(dǎo)致會(huì)話加載:

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

那是因?yàn)?.query 屬性是一個(gè)描述符對(duì)象;訪問(wèn)它會(huì)觸發(fā)與會(huì)話的綁定.

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

替代方法是模擬 _QueryProperty.__get__ 方法(支持 .query 屬性);僅當(dāng)您必須使用實(shí)際的 SomeModel 實(shí)例進(jìn)行測(cè)試時(shí)才使用它:

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'>

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

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

相關(guān)文檔推薦

How should I verify a log message when testing Python code under nose?(在鼻子下測(cè)試 Python 代碼時(shí),我應(yīng)該如何驗(yàn)證日志消息?)
Patch __call__ of a function(修補(bǔ)函數(shù)的 __call__)
How to call self in a mock method of an object in Python?(如何在 Python 中對(duì)象的模擬方法中調(diào)用 self?)
Mocking only a single method on an object(僅模擬對(duì)象上的單個(gè)方法)
Mocking a subprocess call in Python(在 Python 中模擬子進(jìn)程調(diào)用)
Checking call order across multiple mocks(檢查多個(gè)模擬的調(diào)用順序)
主站蜘蛛池模板: 欧美精品一区二区三区在线四季 | 亚洲69p| 欧美高清视频一区 | 国产成人在线视频免费观看 | 91精品国产高清久久久久久久久 | 免费精品在线视频 | 视频一区在线观看 | 欧美日韩亚洲国产 | 国产一区| 国产精品自在线 | 欧美综合一区二区三区 | 日韩欧美成人一区二区三区 | 国产日韩欧美激情 | 夜夜骑天天干 | 久久逼逼 | 欧美精品一区二区三区四区五区 | 国产视频不卡一区 | 久久精品影视 | 久久久www | 不卡av电影在线播放 | 中文字幕亚洲欧美 | 亚洲狠狠爱一区二区三区 | 中文字幕国产精品 | 日韩在线播放第一页 | 日韩在线一区二区 | 中文字幕精品视频 | 亚洲精品影院 | 精品欧美一区二区久久久伦 | 中文字幕一区二区三区在线观看 | 狠狠狠色丁香婷婷综合久久五月 | 岛国在线免费观看 | 四虎国产 | 日韩成人av在线 | 三级在线视频 | 国产成人av在线 | 搞黄网站在线观看 | 桃色五月| 亚洲视频免费在线观看 | 欧美美女一区二区 | 欧美亚洲激情 | 久久久久国产一区二区三区四区 |