2014-12-14 3 views
13

저는 Python 3.4 및 Django 1.7을 사용하고 있습니다. JsonResponse을 반환하는보기가 있습니다.Django의 assertJSONEqual을 사용하여 JsonResponse를 반환하는보기의 응답을 확인하는 방법

def add_item_to_collection(request): 
    #(...) 
    return JsonResponse({'status':'success'}) 

나는 확인하려면 해당 뷰를 반환 올바른 응답을 사용하여 단위 테스트의 경우 : 검사 텟 올바른 방법은 무엇

Error 
Traceback (most recent call last): 
    File "E:\Projects\collecthub\app\collecthub\collecting\tests.py", line 148, in test_success_when_added_before 
    self.assertJSONEqual(response.content, {'status': 'OK'}) 
    File "E:\Projects\collecthub\venv\lib\site-packages\django\test\testcases.py", line 675, in assertJSONEqual 
    data = json.loads(raw) 
    File "C:\Python34\Lib\json\__init__.py", line 312, in loads 
    s.__class__.__name__)) 
TypeError: the JSON object must be str, not 'bytes' 

다음 assertJSONEqual() 라인 예외가 발생하지만

class AddItemToCollectionTest(TestCase): 

    def test_success_when_not_added_before(self): 
     response = self.client.post('/add-item-to-collection') 
     self.assertEqual(response.status_code, 200) 
     self.assertJSONEqual(response.content, {'status': 'success'}) 

응답 내용에 응답에 JSON이 포함되어있을 때? assertJSONEqual()의 원래 값을 비교하려고하면 왜 형식 오류가 발생합니까?

답변

17
당신은 그래서 당신은 self.assertJSONEqual로 전달하기 전에 UTF-8로 인코딩 된 문자열로 response.content를 설정해야합니다 파이썬 3로 작업하는 것 같습니다

:

class AddItemToCollectionTest(TestCase): 

    def test_success_when_not_added_before(self): 
     response = self.client.post('/add-item-to-collection') 
     self.assertEqual(response.status_code, 200) 
     self.assertJSONEqual(
      str(response.content, encoding='utf8'), 
      {'status': 'success'} 
     ) 

을 동시에 파이썬을 모두 지원하려면 당신은 또한 적이있는 이후 장고의 force_text (사용 가능한 사용할 수의 솔루션을 respondcreate 유사

from __future__ import unicode_literals 
from django.utils import six 

class AddItemToCollectionTest(TestCase): 

    def test_success_when_not_added_before(self): 
     response = self.client.post('/add-item-to-collection') 
     self.assertEqual(response.status_code, 200) 

     response_content = response.content 
     if six.PY3: 
      response_content = str(response_content, encoding='utf8') 

     self.assertJSONEqual(
      response_content, 
      {'status': 'success'} 
     ) 
+5

'str' 대신에 다음과 같이 작동합니다 :'response.content.decode ("utf-8")' – jaywink

5

: 2.7 파이썬 3 ships with을 장고 six 호환성 라이브러리를 사용 ion 1.5), 짧은 플랫폼 간 솔루션 :

from __future__ import unicode_literals 
from django.utils.encoding import force_text 

class AddItemToCollectionTest(TestCase): 

    def test_success_when_not_added_before(self): 
     response = self.client.post('/add-item-to-collection') 
     self.assertEqual(response.status_code, 200) 

     self.assertJSONEqual(force_text(response.content), {'status': 'success'})