将Django查询集与JSON数据集进行比较的正确方法是什么?

时间:2017-10-05 15:47:57

标签: django unit-testing django-queryset

我有一个Django单元测试,它创建一个临时数据库并对其应用一些更改。

我还有一个单独的JSON文件,其中包含一个数据版本,表示数据在更改后的外观。

将测试数据上的函数结果与JSON数据集进行比较的最佳推荐方法是什么?

我尝试过使用assertQuerysetEqual()但它似乎并没有起作用。当我做的时候

    self.assertQuerysetEqual(
        Api.objects.all(),
        [repr(record) for record in delete_check_data if record['model'] ==  'fim_app.api'],
        ordered=False
    )

结果是

Traceback (most recent call last):
  File "/Users/davidmaness/development/fim_db/fim_app/tests/delete_test.py", line 49, in test_delete
    ordered=False
  File "/Users/davidmaness/development/fim_db/env/lib/python3.6/site-packages/django/test/testcases.py", line 965, in assertQuerysetEqual
    return self.assertEqual(Counter(items), Counter(values), msg=msg)
AssertionError: Counter({'<Api: 2>': 1, '<Api: 3>': 1, '<Api: 4>': 1}) != Counter({"{'model': 'fim_app.api', 'pk': 1, 'field[474 chars]: 1})

我缺少什么?

1 个答案:

答案 0 :(得分:1)

一种解决方案是将QuerySet的序列化表示与JSON数据而不是QuerySet本身进行比较。例如,如果您使用Django REST Framework来序列化您的实例,那么您可以使用Django的assertEquals()执行比较,如下所示:

    from rest_framework.renderers import JSONRenderer
    from MyApp.models import MyModel
    from MyApp.serializers import MyModelSerializer

    # perform a HTTP GET request on the API endpoint
    api_response = self.client.get('/api/myendpoint/')

    # serialize the model instances
    serializer = MyModelSerializer(MyModel.objects.all(), many=True)

    # convert the serialized data to JSON
    result_expected = JSONRenderer().render(serializer.data)

    # compare the JSON data returned to what is expected
    self.assertEquals(api_response.content, result_expected)