[Django] 심화 [테스트 코드 문제 해결]

손성수·2023년 4월 21일
0

Django

목록 보기
17/17

본 게시글은 스파르타 코딩 클럽 장고 심화 강의 내용에 생긴 문제 해결법을 다루고 있습니다.


문제의 원인

장고 심화 강의 학습 도중, 강의내용과 차이가 있었다.
차이점이 생긴 이유는 강의에서 따로 지급한 코드를 따라 할 수 있지만
지양하는 점은 지금까지 만든 코드에서 차이점을 해결하는 것입니다.



🤔 강의의 코드는 어떤 코드일까?

  • 코드의 핵심 내용은 다음과 같이 설명할 수 있습니다.
  1. 테스트 코드 클래스 메소드를 통해 생성한 오브젝트의 세션 값을 생성합니다.
  2. 생성한 세션값을 reverse를 통해 name = user_view 를 지칭하는 URL로 접속합니다.
  3. APP View.py에서 값을 반환받고
  4. 테스트 코드에서 생성한 오브젝트의 값과 일치하는지 검증합니다.


🤔 왜 검증해야될까?

  • 개발중, 어떠한 수정을 통해 우리가 원하는 결과값이 달라질 수 있습니다.
    따라서 test code에서 제대로 동작하는지 점검하는 과정이라 할 수 있습니다.



🤔 강의를 따라 만든 프로젝트와 어떤 차이점이 있을까?

  • 사진과 같이 강의에서는 reverse 메소드를 이용해 user_view 링크로 이동하고 있습니다.
    이때 클래스에서 생성한 오브젝트가 로그인과정을 통해 얻은 세션값을 보내고 있습니다.

  • 하지만 지금까지 강의를 따라 만든 UserView CBV는 회원가입 절차를 밟고 있습니다.
    따라서 이미 로그인한 계정의 세션값을 보내줄 필요가 없어 오류가 발생합니다.



해결 코드

user app view.py 의 ProfileView CBV

class ProfileView(APIView):
    def get(self,request,user_id):
        user = get_object_or_404(User,id=user_id)
        serializer = UserProfileSerializer(user)
        # return Response(serializer.data)
        return Response(user.email)

user app test.py

    def test_get_user_data(self):
        access_token = self.client.post(reverse('token_obtain_pair'),self.data)
        # print(f"로그인 정보 {self.data}")
        # print("인증 토큰 확인\n",access_token.data['access'])
        # print(f"유저 아이디 {self.user.id}")
        response = self.client.get(
            path=reverse("profile_view",args=[self.user.id]),
            HTTP_AUTHORIZATION=f"Bearer {access_token.data['access']}"
        )
        print(response)
        # reponse 반환 받은 값은 Reponse 객채이므로, content 타입을 변환해야한다.
        email = response.content.decode()
        email = email.replace('"','')
        # 반환 받는 값은
        print(type(self.data['email']),self.data['email'])
        print(type(email),email)
        #
        self.assertEqual(response.status_code,200)
        self.assertEqual(email,self.data['email'])



해결 과정

  1. 먼저 test.py에서 생성한 오브젝트의 로그인 과정이 잘 되는지 확인합니다.

  • 주석의 출력의 기대값은 다음과 같습니다
  1. 로그인한 유저의 정보 딕셔너리 값
  2. 로그인한 유저의 access 값
  3. 로그인한 유저의 id 값


2 . URL 위치를 변경합니다.

reverse 메소드는 지정한 URL의 name값을 지칭하게 되어있습니다.
그런데 여기서 user의 id값을 어떻게 보내냐? 의 문제를 직면하게 됩니다.

reverse('name','int')

이러한 값이 필요하게 되는데
args = [int값] 을 추가하여 문제를 해결할 수 있습니다.




반환받은 값 비교하기

가장 상단의 response의 값을 출력하면 다음과 같은 결과값이 나오게 됩니다.

Response 객채의 status code 값과 우항의 값은 뭔지는 잘 모르겠지만 json이라는것을 확인할 수 있습니다.

따라서 json형태의 값에서 email을 추출하는 과정이 필요하다는것을 알게 되었습니다.

비교하는 과정에서 더 좋은 방법이 있을 수 있고, 완벽한 해결책이 아닙니다.

email의 값을 추출하고 replace를 한 과정이 보이는데,
이 과정 없이 데이터를 출력해보겠습니다.

첫 번째로 출력된것은 클래스에서 만들어낸 오브젝트의 출력값이고

두 번째로 출력된 값은
' 클래스에서 생성한 오브젝트 ' 를 ' view.py '로 발송하여
반환 받은 값 입니다.

type이 str인것은 같으나, 스트링 형식에 차이점이 있습니다. (""가 있음)
따라서 replace를 통해 ""를 제거하고

좌항과 우항의 값이 같은지 비교합니다.

profile
더 노력하겠습니다

0개의 댓글

관련 채용 정보