如何在断言中使用jsonfiy对象?

时间:2014-06-20 15:33:25

标签: json unit-testing python-2.7 flask

我正在尝试对一些代码进行单元测试,并希望断言代码的jsonify输出是正确的。这是我到目前为止所做的。

def test_get_ticket(self):
    with self.app.test_request_context('/?main_id=14522&user_id=82'):
        methodOutput = brain_get_ticket.get_ticket({'main_id': {1: 0}, 'status': {'Closed': 0},
                                                    'available': {'False': 0}}, "main_id, status, available",
                                                   ['main_id', 'status', 'available'])
        correct_return_output = json.dumps(dict(
            to_be_working_on_last_id=0,
            to_be_working_on_id=6,
            information={'status': {'Closed': 1}, 'available': {'False': 1}, 'main_id': {1: 1}}
        ))
        self.assertEquals(json.loads(methodOutput.data()), correct_return_output, "output was: " + str(methodOutput) + " it should be: " + str(correct_return_output))

我得到的输出是:

self.assertEquals(json.loads(methodOutput.data()), correct_return_output)
TypeError: 'str' object is not callable

任何建议????

解决:

主要问题是我使用的数据好像是一个方法,而不是描述符,就像Martijn说的那样。同时将correct_return_output更改为字典而不是jsonify对象,以与实际的方法输出进行比较。谢谢!

1 个答案:

答案 0 :(得分:1)

Response.data is a descriptor并且不需要被调用;你试图在这里调用返回的JSON字符串。

你最好的选择是解码那个JSON响应;字典是无序的,您不应该依赖于生成的JSON数据列出的顺序。您已经这样做了,但是您应该将它与字典进行比较,而不是新的JSON字符串!

def test_get_ticket(self):
    with self.app.test_request_context('/?main_id=14522&user_id=82'):
        methodOutput = brain_get_ticket.get_ticket(
            {'main_id': {1: 0}, 'status': {'Closed': 0},
             'available': {'False': 0}},
            "main_id, status, available", ['main_id', 'status', 'available'])
        correct_return_output = dict(
            to_be_working_on_last_id=0,
            to_be_working_on_id=6,
            information={'status': {'Closed': 1}, 
                         'available': {'False': 1}, 
                         'main_id': {1: 1}})
        self.assertEquals(
            json.loads(methodOutput.data),
            correct_return_output, 
            "output was: {!r}, it should be {!r}".format(
                methodOutput.data, correct_return_output))