본문 바로가기
부트캠프TIL, WIL/AI웹개발(스파르타코딩클럽)

[TIL]2023년 8월 22일 화요일

by 우지uz 2023. 8. 23.
오늘 목표 순공시간 6시간
8시 까지 나의 총 순공시간 : 4시간 30분
채우기 위한 노력 : 11시30분부터 새벽1시까지 추가공부

2. 장고 실무 심화 5주차 테스트코드 강의 끝까지 복습 끝내고, 노션에 모두 기록함.
링크 : https://www.notion.so/Django-af3273ca97584c959af43970e82ee166?pvs=4 

 

Django 실무 심화

A new tool for teams & individuals that blends everyday work apps into one.

www.notion.so

 

3. faker 사용 익히기
(faker 를 이용해서 email 랜덤하게 10개 받아오기, faker에서 유니크 필드들에 대한 랜덤값들을 불러오는 방법, )

4. get_absolute_url 할때 article_id 입력하는 순서. self.pk 적는거 잊지말기

# article.models.py 
def get_absolute_url(self):
        return reverse('article_detail_view', kwargs={"article_id":self.pk}) # 까묵지 말제이~~??
        
# tests.py 
    url = article.get_absolute_url()
    response = self.client.get(url)
    # 이거 익혀두기

5. 에러 해결 - 시리얼라이저로 인한 게시글 생성 400에러,
(https://developer.mozilla.org/ko/docs/Web/HTTP/Status/400)

# 테스트 코드 작성. 
class ArticleCreateTest(APITestCase):
    @classmethod
    def setUpTestData(cls):
        cls.user_data = {'email':'test@kakao.com','account':'tester','username':'testuser','password':'popk1214',}
        cls.article_data = {'title':'some title2', 'content':'some content2'}
        cls.user = User.objects.create_user('test@kakao.com','tester', 'testuser','popk1214')
    def setUp(self):
        self.access_token = self.client.post(reverse('token_obtain_pair'), self.user_data).data['access']
    def test_fail_if_not_logged_in(self):
        url = reverse("article_view")
        response = self.client.post(url, self.article_data)
        self.assertEqual(response.status_code, 401)
    def test_create_article(self):
        response = self.client.post(
            path=reverse("article_view"),
            data=self.article_data,
            HTTP_AUTHORIZATION=f"Bearer {self.access_token}" # setUp에서 받아온 access_token을 넣어주었음.
        )
        self.assertEqual(response.status_code, 200)

여기서 

def setUpTestData(cls):
        cls.user_data = {'email':'test@kakao.com','account':'tester','username':'testuser','password':'popk1214',}
        cls.article_data = {'title':'some title2', 'content':'some content2'}
        cls.user = User.objects.create_user('test@kakao.com','tester', 'testuser','popk1214')

게시글을 생성하는 
        cls.article_data = {'title':'some title2', 'content':'some content2'}에서
문제가 발생했음을 파악했습니다. test_create_article에서 문제가 발생했다고 나오죠!

FAIL: test_create_article (article.tests.ArticleCreateTest.test_create_article)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/ksw4060/Desktop/Coding/django/DRF_Project002/article/tests.py", line 46, in test_create_article
    self.assertEqual(response.status_code, 200)
AssertionError: 400 != 200

(response.status_code가 200이 아니라, 400이라는 건데

상태코드가 400이 나왔다는 것은

잘못된 요청 구문, 유효하지 않은 요청 메시지 프레이밍, 또는 변조된 요청 라우팅
감지해 요청을 처리할 수 없거나, 하지 않는다는 것을 의미합니다.

그러니까 한마디로, 잘못된 입력을 했거나, serializer 에서 문제가 생겼을 수도 있다는 말이죠. 

그런데 입력값들을 보면, 

cls.article_data = {'title':'some title2', 'content':'some content2'}

눈을 씻고 쳐다봐도, 게시글의 제목과 내용을 제대로 입력했다는 것을 볼 수 있었습니다.

그래서 먼저 views.py 에 어떤 시리얼라이저를 사용했나를 확인하고

class ArticleView(APIView):
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    ...

    def post(self, request):
        if not request.user.is_authenticated:
            return Response({"message":"로그인 해주세요"}, status=status.HTTP_401_UNAUTHORIZED)

        serializer = ArticleCreateSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(user=request.user)
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

 

serializers.py 에서 ArticleCreateSerializer를 확인한 결과

class ArticleCreateSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()
	upload_image = serializers.ImageField()
    
    def get_user(self, obj):
        return obj.user.username

    class Meta:
        model = Article
        fields = ["id", "title", "content", "user", "upload_image"]
        extra_kwargs={
            "title": {
                "error_messages": {
                    "blank": "제목을 입력해주세요",
                }
            },
            "content": {
                "error_messages": {
                    "blank": "게시글 내용을 입력해주세요",
                },
            },
            "upload_image": {
                "error_messages": {
                    "blank": "이미지를 입력해주세요",
                },
            },

        }

업로드 이미지 필드를 필수로 받고 있다는 것을 알 수 있었습니다. 

그래서 삭제하고 테스팅을 다시 하니, 정상적으로 테스팅에 통과했습니다.

# 수정된 코드
class ArticleCreateSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()

    def get_user(self, obj):
        return obj.user.username

    class Meta:
        model = Article
        fields = ["id", "title", "content", "user"]
        extra_kwargs={
            "title": {
                "error_messages": {
                    "blank": "제목을 입력해주세요",
                }
            },
            "content": {
                "error_messages": {
                    "blank": "게시글 내용을 입력해주세요",
                },
            },

        }