2017-10-05 51 views
0

我有一個Django單元測試,它創建一個臨時數據庫並對其應用一些更改。將Django查詢集與JSON數據集進行比較的正確方法是什麼?

我還有一個單獨的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}) 

我缺少什麼?

回答

0

一個解決方案是將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) 
相關問題