【问题标题】:Mocking pymongo in Flask在 Flask 中模拟 pymongo
【发布时间】:2013-05-28 20:45:30
【问题描述】:

我在测试我的 Flask 应用程序时遇到了一点问题。我的观点是这样的:

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
    })

我的测试功能是这样的:

@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)

如果我尝试在测试函数中打印模拟对象,它们会返回正确的值。然而,在我看来,我仍然得到:

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 变量返回为&lt;MagicMock name='pymongo.db.photos.find_one()' id='59485392'&gt;。

我是不是用了mock bad方式,打错地方了?

【问题讨论】:

  • 为什么我们在您的异常回溯中看到''.join,而不是在您上面粘贴的 prelogin() 函数的主体中?与您展示的代码版本是否相同?另请注意,您的“除了 AttributeError”将不起作用,我认为您想要“除了 KeyError”。
  • @A.JesseJiryuDavis 我很抱歉,将旧异常与新代码混合在一起。两者都是最新的,问题仍然存在。谢谢指正。
  • 我认为您的 mock_user 和 mock_pymongo 参数顺序错误;最外层的@patch(第一个/最远离方法)是最后一个方法参数。
  • @TommiKomulainen 这看起来像个问题。非常感谢。你能写一个正确的答案让我接受吗?

标签: python mocking flask pymongo


【解决方案1】:

您的mock_user 和mock_pymongo 参数顺序错误;最外面的@patch(第一个/最远离方法)是最后一个方法参数。应该是

@patch('arounded.userv2.views.User')
@patch('arounded.userv2.views.pymongo')
def test_valid_prelogin(self, mock_pymongo, mock_user):

【讨论】:

    猜你喜欢
    • 2015-05-25
    • 2015-03-30
    • 2015-04-01
    • 1970-01-01
    • 2016-06-05
    • 2015-02-25
    • 1970-01-01
    • 2018-02-27
    • 2019-12-13
    相关资源
    最近更新 更多