[英]Mocking pymongo in Flask
I've got little problem with testing my Flask app. 测试我的Flask应用程序时遇到了一些问题。 My view looks like this:
我的观点如下:
def prelogin():
email = request.args.get('email')
if not email:
return '', 204
user = User.query.filter({'email': email}).first()
if not user:
return '', 204
address = current_app.config['UPLOADED_PHOTOS_URL']
try:
mongo_photo = pymongo.db.photos.find_one(user.photo)
photo = address + mongo_photo['file']
except (KeyError, AttributeError):
photo = None
return jsonify({
'email': email,
'fullname': user.fullname,
'photo': photo
})
and my test function like this: 我的测试功能如下:
@patch('arounded.userv2.views.User')
@patch('arounded.userv2.views.pymongo')
def test_valid_prelogin(self, mock_user, mock_pymongo):
user_config = {
'filter.return_value.first.return_value.fullname': 'Someone'
}
mock_user.query.configure_mock(**user_config)
mock_pymongo.db.photos.find_one.return_value = {'file': 'no-photo.png'}
response = self.client.get(
'/api/v2/users/prelogin?email=someone@example.com')
self.assert_status(response, 200)
If I try to print mock objects in test function, they return correct values. 如果我尝试在测试函数中打印模拟对象,它们将返回正确的值。 Yet in view I'm still getting:
然而,鉴于我仍然得到:
arounded/userv2/views.py line 40 in prelogin
'photo': photo
/home/sputnikus/.virtualenvs/arounded_site2/lib/python2.7/site-packages/flask_jsonpify.py line 60 in jsonpify
indent=None if request.is_xhr else 2)),
/usr/lib64/python2.7/json/__init__.py line 250 in dumps
sort_keys=sort_keys, **kw).encode(obj)
/usr/lib64/python2.7/json/encoder.py line 209 in encode
chunks = list(chunks)
/usr/lib64/python2.7/json/encoder.py line 434 in _iterencode
for chunk in _iterencode_dict(o, _current_indent_level):
/usr/lib64/python2.7/json/encoder.py line 408 in _iterencode_dict
for chunk in chunks:
/usr/lib64/python2.7/json/encoder.py line 442 in _iterencode
o = _default(o)
/usr/lib64/python2.7/json/encoder.py line 184 in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <MagicMock name='pymongo.db.photos.find_one().__getitem__().__radd__()' id='67038032'> is not JSON serializable
mongo_photo
variable is returned as <MagicMock name='pymongo.db.photos.find_one()' id='59485392'>
. mongo_photo
变量以<MagicMock name='pymongo.db.photos.find_one()' id='59485392'>
。
Do I use mock bad way, patching on wrong place? 我是否使用模拟糟糕的方式,在错误的地方打补丁?
Your mock_user
and mock_pymongo
arguments are in wrong order; 你的
mock_user
和mock_pymongo
参数的顺序错误; the outermost @patch (first/furthest away from the method) is the last method argument. 最外层的@patch(距离方法最远/最远)是最后一个方法参数。 It should be
它应该是
@patch('arounded.userv2.views.User')
@patch('arounded.userv2.views.pymongo')
def test_valid_prelogin(self, mock_pymongo, mock_user):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.