오늘 목표 순공시간 6시간
8시 까지 나의 총 순공시간 : 4시간 30분
채우기 위한 노력 : 11시30분부터 새벽1시까지 추가공부
2. 장고 실무 심화 5주차 테스트코드 강의 끝까지 복습 끝내고, 노션에 모두 기록함.
링크 : https://www.notion.so/Django-af3273ca97584c959af43970e82ee166?pvs=4
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": "게시글 내용을 입력해주세요",
},
},
}
'부트캠프TIL, WIL > AI웹개발(스파르타코딩클럽)' 카테고리의 다른 글
[TIL]2023년 8월 24일 목요일 (0) | 2023.08.24 |
---|---|
[TIL] 2023년 8월 23일 수요일 (0) | 2023.08.23 |
[TIL]2023년 8월 21일 월요일. (1) | 2023.08.22 |
[AI웹개발][68일차TIL] 자바스크립트 동작원리, (stack, Queue, event loop)[코딩애플] 자료구조기본개념 (0) | 2023.08.19 |
[AI웹개발][67일차TIL] 프로토콜(protocol)과 무상태 프로토콜(stateless protocol)이란 ? (0) | 2023.06.28 |