test.py에서 test를 하는 이유
test 하지않았을 때 문제점 :
1. 시간낭비 : 매번 같은 값을 수동으로 입력해서 테스트
2. 복잡도 증가 : 새로운 기능이 추가될때마다 어디서 문제가 생겼는지 모를 수 있음
3. 허점 : 제대로 돌아가지 않는 기능을 테스트 해보지 못하고 넘어갈 수 있음
test 쓰는 이유 :
1. 버그 쉽고 빠르게 찾기 가능
2. 시간, 돈 아낄 수 있음
3. 신뢰도 상승
4. 문서화가 쉬움
5. 시간이 얼마나 걸리는 지 등의 performance 테스트 가능
6. 코드 복잡도 감소
등등등
test.py에서 test 작성 시, views.py에서 직접 내용만 쓸 수 있음.
(test 대상이 파이썬, 장고 등의 라이브러리, 프레임워크가 되어서는 안된다.)
※ 잡담 / 찡찡대기 ※
개인 프로젝트로 포스트맨을 이용한 개인 블로그 만들기 중.
회원가입, 로그인, 글 작성, 전체 글 보기 까지는 슈루루루룩 잘 됌.
근데 [ 글 수정/삭제/detail페이지get ] 이 안되는데 시간을 몇 시간 투자중... (1시넘음 ㅠ)
이건 무조건 고치고 간단 마인드가 꺾여버릴 것 같음.
views.py에 한 클래스 안에 get, put, delete를 넣어서 작성했고, 이 세개만 안되는 상황.
즉, 이 클래스가 뭔가 문제가 있다는 뜻.
그리고 오류내용은
TypeError: ArticleDetailView.get() got an unexpected keyword argument 'article_id'
[26/Sep/2023 00:59:38] "GET /articles/1/ HTTP/1.1" 500 95320
오류 내용에서도 볼 수 있는데, views.py의 ArticleDetailView class가 'article_id'를 인식을 못하는 중인것같음.
근데 연결 됐다고!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
urls.py
article_id 들어가 있고, class명 오타 없고, 문제없음.
from articles import views
from django.urls import path
urlpatterns = [
path('', views.ArticleView.as_view(), name='article_view'),
path('feed/', views.FeedView.as_view(), name='feed_view'),
path('<int:article_id>/', views.ArticleDetailView.as_view(),
name='article_detail_view'),
]
views.py
class명 맞고, article_id 다 정의해줬고, import도 다했고!!!!!!!!!!!!
# 게시글 보기/수정/삭제
class ArticleDetailView(APIView):
def get(self, request, article_id):
article = get_object_or_404(Article, id=article_id)
serializer = ArticleSerializer(article)
return Response(serializer.data, status=status.HTTP_200_OK)
def put(self, request, article_id):
article = get_object_or_404(Article, id=article_id)
if request.user == article.user:
serializer = ArticleCreateSerializer(article, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
else:
return Response("권한이 없습니다!", status=status.HTTP_403_FORBIDDEN)
def delete(self, request, article_id):
article = get_object_or_404(Article, id=article_id)
if request.user == article.user:
article.delete()
return Response("삭제완료", status=status.HTTP_204_NO_CONTENT)
else:
return Response("권한이 없습니다!", status=status.HTTP_403_FORBIDDEN)
serializers.py
class ArticleSerializer 에서 fields 전부다 가져오고있고!!!!!!!
from rest_framework import serializers
from articles.models import Article
class ArticleCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ("title", "image", "content")
class ArticleListSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField()
def get_user(self, obj):
return obj.user.email
class Meta:
model = Article
fields = ("pk", "title", "image", "updated_at",
"user")
class ArticleSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField()
def get_user(self, obj):
return obj.user.email
class Meta:
model = Article
fields = '__all__'
migration 도 다 했고!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 뭐가 문젠데
발견하면 수정해서 글 작성할 예정,,,
발견완료 (현재시각 02:36)
나는 바보다.
처음에 프로젝트를 만들기 전에, 미리 views.py를 작성해놓았는데, ArticleDetailView 를 위에 작성하고, 아래에 pass로 작성해 버렸다... 난 바보다
# 게시글 보기/수정/삭제
class ArticleDetailView(APIView):
def get(self, request, article_id):
article = get_object_or_404(Article, id=article_id)
serializer = ArticleSerializer(article)
return Response(serializer.data, status=status.HTTP_200_OK)
def put(self, request, article_id):
article = get_object_or_404(Article, id=article_id)
if request.user == article.user:
serializer = ArticleCreateSerializer(article, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
else:
return Response("권한이 없습니다!", status=status.HTTP_403_FORBIDDEN)
def delete(self, request, article_id):
article = get_object_or_404(Article, id=article_id)
if request.user == article.user:
article.delete()
return Response("삭제완료", status=status.HTTP_204_NO_CONTENT)
else:
return Response("권한이 없습니다!", status=status.HTTP_403_FORBIDDEN)
# 모아보기(feed)
class FeedView(APIView):
def get(self, request):
pass
def post(self, request):
pass
# 게시글 상세보기
class ArticleDetailView(APIView):
def get(self, request):
pass
def post(self, request):
pass