상세 컨텐츠

본문 제목

221028 DRF 5일차 타임어택 & 테스트코드

카테고리 없음

by hunss 2022. 10. 28. 11:05

본문

테스트코드를 공부하다가 타임어택을 했는데, 테스트코드가 중요한게 아니라 일단 기본적인 DRF로 CRUD먼저 잘해야하니까 타임어택치고 다시 풀어보고 이해하는데 시간을 썻다.


내가 몰랐던 부분

기본적으로 django에서 제공하는 User model을 import해와서 써야했는데, 이걸 몰라서 새로 User app을 만들고 model을 만들고 하는 뻘짓을 했다.

from django.contrib.auth.models import User

이 코드를 통해 기본User model을 import해올 수 있다.

 

그리고 serializers.py에서 만들 때,

read_only_fields = (~~) + views.py에서 .save()할 때 save(여기에 내가 input안해도 자동을 저장시킬 data 넣어줄 수 있음)

이런식으로 내가 input 에 넣지 않아도 output에 보여주고 싶은 필드를 정해줄 수 있다.


돌이키면 쉬운데, 그래도 serializer에 대해 좀 더 이해할 수 있는 타임어택 이었는듯?

이렇게 처음부터 해보는게 진짜 도움되는 거 같다.


테스트 코드 공부한 곳 까지

class UserRigistrationTest(APITestCase):
    def test_registration(self):
        url = reverse("UserView")
        user_data = {
            "email":"test@test.com",
            "password":"123",
        }
        response = self.client.post(url, user_data)
        self.assertEqual(response.status_code, 201)

 

test.py 인데 작성한 거 일부분이다.

UserView에서는 지금 post로 input된 data를 serializer해서 유효성 검사 후에 그 데이터를 저장해주고 있다.

reverse("UserView")을 통해 UserView에 해당하는 url을 가져와서

거기다가 user_data= {input 값}을 넣어준다.

그럼 APITestCase에서 기본적으로 client을 생성해주는데 post로 url과 user_data를 넣어주면 response.

이 response의 상태코드가 ㅁㅁㅁ 으로 뜰 탠데, 이거랑 201이랑 같은지 확인하는 코드이다.


여기서 한단계 더 진행하면 setUp이란게 있다.

위에처럼 회원가입이 되는지 안되는지 확인하는 메소드를 작성하고 또 로그인이 되는지 확인하는 메소드를 작성했을 때 문제점은

회원가입 메소드가 돌아가면 기존 db에 저장하는게 아니라 test db를 생성했다가 메소드가 끝나면 이 test db가 사라진다.

그리면 로그인메소드가 돌 때는 회원가입이 되어있는 상태가 아니라 로그인메소드가 재대로 되는지 확인이 불가능.

 

class LoginUserTest(APITestCase):
    def setUp(self):
        self.data = {'email': 'test@test.com', 'password': '123'}
        self.user = User.objects.create_user('test@test.com', '123')
   
    def test_login(self):
        response = self.client.post(reverse('token_obtain_pair'), self.data)
        self.assertEqual(response.status_code, 200)

 

이러한 문제를 해결하는게 setUp이다.

self.data에 input으로 넣어주고

이 글에서는 안보여줬지만 users/models.py 에 UserManager에 create_user(self, email, password)가 있다.

self.user 에 create_user로 User 오브젝트를 만든다.

 

그리고 simplejwt에서 쓰는 token_obtain_pair로 로그인하는데 reverse로 url불러와서 위에 self.data와 함께 client.post로 보낸다.

그럼 이 response의 status_code가 200이냐 묻는 코드이다.

 

일단 테스트코드는 여까지