30

Python 3.4 と Django 1.7 を使用しています。を返すビューがありますJsonResponse

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

単体テストを使用して、そのビューが正しい応答を返すかどうかを確認したい:

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'})

ただし、このassertJSONEqual()行では例外が発生します。

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'

応答にJSONが含まれている場合、応答の内容を確認する正しい方法は何ですか? 生の値と dict を比較しようとすると、型エラーが発生するのはなぜassertJSONEqual()ですか?

4

2 に答える 2

10

Respondcreate のソリューションと同様に、Django のforce_text (バージョン 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'})
于 2015-10-04T09:00:23.483 に答える