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'...
이제 모든 것이 정상적으로 돌아간다.