Python 鼻子测试在 JSON 响应中失败
Python nose test failing on JSON response
这是 ReportRunner class 在 report_runner.py 在我的 Flask-Restful 应用程序中的方法:
class ReportRunner(object):
def __init__(self):
pass
def setup_routes(self, app):
app.add_url_rule("/run_report", view_func=self.run_report)
def request_report(self, key):
# code #
def key_exists(self, key):
# code #
def run_report(self):
key = request.args.get("key", "")
if self.key_exists(key):
self.request_report(report_type, key)
return jsonify(message = "Success! Your report has been created.")
else:
response = jsonify({"message": "Error => report key not found on server."})
response.status_code = 404
return response
鼻子测试调用与该路线关联的 URL
def setUp(self):
self.setup_flask()
self.controller = Controller()
self.report_runner = ReportRunner()
self.setup_route(self.report_runner)
def test_run_report(self):
rr = Report(key = "daily_report")
rr.save()
self.controller.override(self.report_runner, "request_report")
self.controller.expectAndReturn(self.report_runner.request_report("daily_report"), True )
self.controller.replay()
response = self.client.get("/run_report?key=daily_report")
assert_equals({"message": "Success! Your report has been created."}, response.json)
assert_equals(200, response.status_code)
并且测试失败并显示以下消息:
AttributeError: 'Response' object has no attribute 'json'
但根据 docs 看来您就是这样做的。我是从方法中更改 return 值,还是需要以不同方式构建测试?
测试通过,写成这样:
json_response = json.loads(response.data)
assert_equals("Success! Your report has been created.", json_response["message"])
但我不清楚这两种方法之间的区别。
根据 Flask API 响应 对象没有属性 json(它是 Request 对象)。所以,这就是你得到例外的原因。相反,它具有通用方法 get_data() returns 响应主体的字符串表示形式。
json_response = json.loads(response.get_data())
assert_equals("Success! Your report has been created.", json_response.get("message", "<no message>"))
所以,它与您所拥有的很接近,除了:
建议使用 get_data() 而不是数据,因为 API 表示:不应使用并最终会被弃用。
使用 get() 从字典中读取值,以便在密钥丢失时不生成异常,但获得有关丢失消息的正确断言。
还要检查 this Q&A。
这是 ReportRunner class 在 report_runner.py 在我的 Flask-Restful 应用程序中的方法:
class ReportRunner(object):
def __init__(self):
pass
def setup_routes(self, app):
app.add_url_rule("/run_report", view_func=self.run_report)
def request_report(self, key):
# code #
def key_exists(self, key):
# code #
def run_report(self):
key = request.args.get("key", "")
if self.key_exists(key):
self.request_report(report_type, key)
return jsonify(message = "Success! Your report has been created.")
else:
response = jsonify({"message": "Error => report key not found on server."})
response.status_code = 404
return response
鼻子测试调用与该路线关联的 URL
def setUp(self):
self.setup_flask()
self.controller = Controller()
self.report_runner = ReportRunner()
self.setup_route(self.report_runner)
def test_run_report(self):
rr = Report(key = "daily_report")
rr.save()
self.controller.override(self.report_runner, "request_report")
self.controller.expectAndReturn(self.report_runner.request_report("daily_report"), True )
self.controller.replay()
response = self.client.get("/run_report?key=daily_report")
assert_equals({"message": "Success! Your report has been created."}, response.json)
assert_equals(200, response.status_code)
并且测试失败并显示以下消息:
AttributeError: 'Response' object has no attribute 'json'
但根据 docs 看来您就是这样做的。我是从方法中更改 return 值,还是需要以不同方式构建测试?
测试通过,写成这样:
json_response = json.loads(response.data)
assert_equals("Success! Your report has been created.", json_response["message"])
但我不清楚这两种方法之间的区别。
根据 Flask API 响应 对象没有属性 json(它是 Request 对象)。所以,这就是你得到例外的原因。相反,它具有通用方法 get_data() returns 响应主体的字符串表示形式。
json_response = json.loads(response.get_data())
assert_equals("Success! Your report has been created.", json_response.get("message", "<no message>"))
所以,它与您所拥有的很接近,除了:
-
建议使用
get_data() 而不是数据,因为 API 表示:不应使用并最终会被弃用。
使用 get() 从字典中读取值,以便在密钥丢失时不生成异常,但获得有关丢失消息的正确断言。
还要检查 this Q&A。