test에 대해서 공부중인데
아직까지 이걸 꼭 해야하나 싶다..
오늘도 화이팅!
self.assertEqual()
- 괄호 안에 두 값을 비교하는 함수
- 예시1) self.assertEqual(2,3) - 2와 3을 비교하는데 다르니까 'FAILED'가 나온다.
- 예시2) self.assertEqual(response.status_code, 200) - response의 status코드를 비교하는 것으로 200이 나오면 'OK'가 나오고 아니면 FAILED가 나온다.
from django.urls import reverse
- reverse 는 urls.py의 urlpatterns 안에 있는 name값들을 이용해서 해당 path를 가져올 수 있다.
- 예시1) url = reverse("user_view") - users.py의 name의 값이 user_view인 것을 url 변수에 넣는다 라는 뜻
- 예시2) response = self.client.post(reverse(token_obtain_pair), self.data) - name의 값(token_obtain_pair)과 self.data의 값을 client를 이용해서 post을 보내 그 값을 response에 담는다는 뜻
setUp 메소드
- test를 진행 할 때는 원래 모든 test는 서로 독립적이여야 하지만 setUp 메소드를 이용하면 이 메소드 이후에 작성한 모든 test메소드를 시작하기전에 먼저 불러와진다.
- 예시)
def setUp(self):
self.data = {'email': 'john@naver.com', 'password' : 'johnpassword'}
self.user = User.objects.create_user('john@naver.com', 'johnpassword')
이 메소드 뒤에 적은 test 메소드들은 setUp메소드 안의 변수들을 활용할 수 있다!
client 활용시 주의점
self.client.post 나 self.client.get 등 이용할 때 reverse를 이용해 path값을 불러오는데 이때 해당 함수( 예를 들어, name = 'user_view'를 불러올때 이용하는 함수 - UserView ) 안에 post면 post가, get이면 get 메소드가 정의 되어 있어야 한다
- 예시
# users/views.py
class UserView(APIView):
def post(self, request):
serializer = UserSerializer(data = request.data)
if serializer.is_valid():
serializer.save()
return Response({"message":"가입완료"}, status=status.HTTP_200_OK)
else:
return Response({"message":f"${serializer.errors}"}, status=status.HTTP_400_BAD_REQUEST)
#users/tests.py
class LoginUserTest(APITestCase):
def setUp(self):
self.data = {'email': 'john@naver.com', 'password' : 'johnpassword'}
self.user = User.objects.create_user('john@naver.com', 'johnpassword')
def test_get_user_data(self):
access_token = self.client.post(reverse('token_obtain_pair'), self.data).data['access']
response = self.client.get(
path=reverse("user_view"),
HTTP_AUTHORIZATION=f"Bearer {access_token}"
)
# self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['email'], self.data['email'])
이를 실행하게 되면,
response.data['email']의 값이 없다고 나온다. 즉 get으로 받아와야 하는데 get 메소드가 없어서 오류가 난것이다.
+ get메소드 추가 후 실행하면 정상적으로 작동하게 된다.
class UserView(APIView):
def get(self, request):
return Response(UserSerializer(request.user).data, status=status.HTTP_200_OK)
'내일 배움 캠프 > TIL' 카테고리의 다른 글
TIL) 9주차 2일 (0) | 2023.05.10 |
---|---|
TIL) 9주차 1일 (0) | 2023.05.09 |
TIL) 8주차 3일 (0) | 2023.05.04 |
TIL) 8주차 1일 (0) | 2023.05.02 |
TIL) 7주차 5일 (0) | 2023.05.02 |