[Django] JsonResponse()을 return하는 View 테스트

짱구석·2020년 11월 8일
0
post-thumbnail

Django로 회원가입 뷰를 테스트 하면서 HttpResponse가 아닌 JsonResponse를 사용했다.

return JsonResponse({'message': 'SUCCESS'}), status=200)

httpie 를 통해 다음과 같이 작성하여 테스트 해보면

> http -v POST 127.0.0.1:8000/user/signup/ name='Unknown' password='Unknownpassword' phone_number='Unknownpho' email='aa11aa@gmail.com'
POST /user/signup/ HTTP/1.1
Accept: application/json, */*;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 109
Content-Type: application/json
Host: 127.0.0.1:8000
User-Agent: HTTPie/2.3.0

{
    "email": "aa11aa@gmail.com",
    "name": "Unknown",
    "password": "Unknownpassword",
    "phone_number": "Unknownpho"
}

HTTP/1.1 200 OK
Content-Length: 22
Content-Type: application/json
Date: Sat, 07 Nov 2020 08:29:35 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.8.3
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "message": "SUCCESS"
}

다음과 같이 "message" : "SUCCESS" 가 나온다.

이를 Django Test로 테스트 하기 위해서 다음과 같이 작성하였다.

def test_success(self):

    request = {
        'name'         : self.GOOD_NAME,
        'phone_number' : self.GOOD_PHONE_NUMBER,
        'email'        : self.GOOD_EMAIL,
        'password'     : self.GOOD_PASSWORD
    }

    response = self.client.post(self.URL, request)
    self.assertEqual(response['message'],'SUCCESS')
    self.assertEqual(response.status_code,200)

그러나....

# error
>> python manage.py test
>> json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

계속해서 다음과 같은 에러가 나왔다.(으어어어어어어ㅠㅠㅠ)

오늘도 역시 다분한 삽질 결과

Djang Test.client()를 이용하여 post 후 받아온 Response를 그냥 assertEqual(response, "SUCCESS") 했던 것이 문제였다.

나의 경우 JsonResponse 를 사용했기 때문에 테스트 출력도 그에 맞게 변경이 필요하다.

def test_success(self):

    request = {
        'name'         : self.GOOD_NAME,
        'phone_number' : self.GOOD_PHONE_NUMBER,
        'email'        : self.GOOD_EMAIL,
        'password'     : self.GOOD_PASSWORD
    }
    # 여기를 수정한다.
    # response = self.client.post(self.URL, request)
    # self.assertEqual(response['message'],'SUCCESS')
    response = self.client.post(self.URL, request, content_type='application/json')
    self.assertEqual(response.json()['message'],'SUCCESS')
    self.assertEqual(response.status_code,200)

response = self.client.post(self.URL, request, content_type='application/json')

여기에 content_type='applictaion/json' 를 추가해줌으로써 jsonresponse 가 올바르게 인식되도록하였다.

변경 후 결과를 보자

## Creating test database for alias 'default'...
System check identified no issues (0 silenced).
........

Ran 8 tests in 0.062s

OK
Destroying test database for alias 'default'...

이제 모든 것이 정상적으로 돌아간다.

0개의 댓글