【问题标题】:Python nose test failing on JSON responsePython 鼻子测试在 JSON 响应上失败
【发布时间】:2015-02-21 07:31:01
【问题描述】:

这是我的 Flask-Restful 应用中 report_runner.py 的 ReportRunner 类中的方法:

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,您似乎就是这样做的。我是要更改方法的返回值,还是需要以不同的方式构建测试?

现在测试通过了,这样写:

json_response = json.loads(response.data)
assert_equals("Success! Your report has been created.", json_response["message"])

但我不清楚这两种方法之间的区别。

【问题讨论】:

  • 如前所述,您的问题正是文档所说的应该如何完成。需要更多上下文来了解出了什么问题,例如完整的 API 方法和完整的测试。
  • 什么是response.status_code,在您致电assert_equals() 之前?
  • this question 中的 cmets 暗示您可能希望使用 response.json() 而不是 response.json。不过,这并不能解决您的问题。
  • @SeanAzlin 响应码是 200。
  • 我认为 jsonify() 需要被调用,但我对flask了解不多。

标签: python json nosetests flask-restful


【解决方案1】:

根据Flask API Response 对象没有属性 json (它是 Request 对象有它)。所以,这就是你得到异常的原因。相反,它具有通用方法 get_data(),该方法返回响应正文的字符串表示形式。

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

【讨论】:

    猜你喜欢
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多