2015-02-20 6 views
1

Это метод в классе ReportRunner в report_runner.py в моей Колбе-Restful приложения:теста носа Python неудача в ответ JSON

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"]) 

, но я не ясно, о разнице между этими двумя подходами.

+0

Как указано, ваша проблема заключается в том, как документация говорит, что это должно быть сделано. Необходимо больше контекста, чтобы понять, что происходит неправильно, например. полный метод API и полный тест. – logc

+1

Что такое 'response.status_code' как раз перед вызовом' assert_equals() '? –

+0

Также комментарии в [этот вопрос] (http://stackoverflow.com/questions/25398218/getting-json-response-using-requests-object-flask) подразумевают, что вы можете использовать 'response.json()' вместо 'response.json'. Тем не менее, это не повлияет на вашу проблему. –

ответ

4

Согласно Flask APIResponse объект не имеет атрибут 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() не генерировать исключение, если ключ отсутствует, но получить правильный Assert об отсутствии сообщения.

Проверьте также this Q&A.