【发布时间】:2016-10-20 04:16:57
【问题描述】:
我正在尝试学习如何在 python 中使用 Mock 库。
我有一个通过 redis-py 包连接到 Redis 的 Flask 应用程序。
在我的应用程序的“/myapp/version”API 中,我从 redis-py 调用 info(),并格式化返回的 HTTP 响应,其中 JSON 数据还包括 info() 调用的返回数据:
from flask import Flask, jsonify
from redis import StrictRedis
app = Flask(__name__)
redis = StrictRedis(host='redis', port=6379)
@app.route('/myapp/version', methods=['GET'])
def get_version():
redis_info = redis.info() #returns a dict
return jsonify({
'app_version': '0.1',
'flask_version': '0.11.1',
'redis_info': redis_info
})
这是我的 test.py,它使用了 Flask test_client:
import json
import mock
import redis
import myapp import app
class TestApp:
@classmethod
def setup_class(self):
self.client = app.test_client()
self.client.testing = True
@mock.patch.object(redis.StrictRedis, 'info')
def test_get_version(self, mock_info):
result = self.client.get('/myapp/version')
assert result.status_code == 200
mock_info.assert_called()
如果我启动鼻子测试,来自 HTTP 请求的响应将返回错误:
TypeError: <MagicMock name='info()' id='140548379595472'> is not JSON serializable
我猜问题是 info() 调用被正确地模拟了,但是它不能被序列化为 JSON 以格式化 Flask 测试客户端的响应。
有没有办法获得有效的响应?或者,也许我以错误的方式使用 Mock?我知道它在单元测试中很方便,但在这里它更像是集成测试。
【问题讨论】:
标签: python json flask redis mocking