test_create_tag_successful
매서드를 마지막에 생성할게요.
tag 생성 요청을 클라이언트에 보낼거에요. 그리고 이후 response로 객체가 존재하는지 존재하지 않는지 테스트디비에서 filter를 통해 받아오고 이를 assertTrue를 통해서 확인하게되요.
self.user가 어디서 굴러 온 녀석인지 궁금 할 수 있는데요.
아래와 같이 우리가 이미 디비가 돌아가가전 setUp메서드에서 변수 선언을 일찌감치 해뒀어요.
class PrivateTagsApiTests(TestCase):
"""Test the authorized user tags API"""
def setUp(self):
self.user = get_user_model().objects.create_user(
'test@testtest.com',
'password123',
)
def test_create_tag_successful(self):
"""Test creating a new tag"""
payload = {'name': 'Test tag'}
self.client.post(TAGS_URL, payload)
exists = Tag.objects.filter(
user=self.user, name=payload['name']
).exists()
self.assertTrue(exists)
def test_create_tag_invalid(self):
"""Test creating a new tag with invalid payload"""
payload = {'name':''}
res = self.client.post(TAGS_URL, payload)
self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST)
하단의 test_create_tag_invalid
메서드는 test_create_tag_successful
과는 반대로 400 error를 발생시키는건데요 name이라는 키에 값을 빈 상태로 둔채로 request요청을 post로 보낼 경우를 테스트하는거에요.
2 failure
발생합니다.
mixins.CreateModelMixin
클래스를 TagViewSet
클래스에 추가 상속해줄게요.
perform_create
메서드를 오버라이딩 해서 사용하기 위해서에요.
perfome_create에 대한 정보는 클릭해서 디테일한 정보를 확인할 수 있어요.
...
class TagViewSet(viewsets.GenericViewSet,
mixins.ListModelMixin,
mixins.CreateModelMixin):
# override this method for CreateModelMixin
# create operation is done here (unlike in UserModelSerializer)
# because serializer does not have user
# we pass user to serializer and save it
def perform_create(self, serializer):
"""CREATE A NEW TAG"""
serializer.save(user=self.request.user)
Mixin
클래스에 대한 구체적이고 세밀한 이해가 있어야 할 것 같아요. 추후 drf공식 문서를 몇번 쭉 훑어봐야할 필요성이 꼭꼭 느껴지네요.