Django Rest Api - 如何测试 POST 是否将数据保存在数据库中?
Django Restapi - How to test if POST saves data in database?
所以我发现了这个问题:
而且我了解到只要函数是 运行,用 POST 请求创建的数据应该是可以访问的。所以我在一个函数中完成了整个测试:
class PostMovieAPITest(APITestCase):
def test_correct_request(self):
title = 'Snatch'
response = self.client.post('/movies/', data={'title': title}, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
movies = Movie.objects.all()
self.assertTrue(Movie.objects.get(title=title))
问题是,Movie.objects.all()
是空的,即使我在同一个函数中发送了 CREATE/POST 请求。当我执行“manage.py runserver”并在浏览器中测试时,API 工作正常。但是如何编写适当的测试来检查数据是否实际保存在数据库中?
urls.py:
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from api import views
router = routers.DefaultRouter()
router.register(r'movies', views.MovieViewSet)
urlpatterns = [
path('', include(router.urls)),
path('admin/', admin.site.urls),
]
views.py:
class MovieViewSet(viewsets.ModelViewSet):
queryset = Movie.objects.all()
serializer_class = MovieSerializer
def create(self, request, *args, **kwargs):
title = request.data.get('title')
if not title:
return Response({'Error': "Body should be {'title':'The title of the Movie'}"}, status=status.HTTP_400_BAD_REQUEST)
data = get_data_from_omdb(title)
if len(data) == 0:
return Response({"Error": "Title does not exist in OMDB database"}, status=status.HTTP_400_BAD_REQUEST)
serializer = MovieSerializer(data=data, context={'request': request})
if serializer.is_valid(raise_exception=False):
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
感谢 Ozgur Akcali 的评论,找到了问题。我无法获取电影,因为电影 object 是根据来自外部 API 的数据创建的,包括标题。
"Hire me!" -> "Hire Me!"
有时候写脚本让我想杀人。非常感谢,抱歉浪费您的时间。
def test_correct_request(self):
title = 'Hire Me!' # was: 'Hire me!'
response = self.client.post('/movies/', data={'title': title}, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertTrue(Movie.objects.get(title=title))
所以我发现了这个问题:
而且我了解到只要函数是 运行,用 POST 请求创建的数据应该是可以访问的。所以我在一个函数中完成了整个测试:
class PostMovieAPITest(APITestCase):
def test_correct_request(self):
title = 'Snatch'
response = self.client.post('/movies/', data={'title': title}, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
movies = Movie.objects.all()
self.assertTrue(Movie.objects.get(title=title))
问题是,Movie.objects.all()
是空的,即使我在同一个函数中发送了 CREATE/POST 请求。当我执行“manage.py runserver”并在浏览器中测试时,API 工作正常。但是如何编写适当的测试来检查数据是否实际保存在数据库中?
urls.py:
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from api import views
router = routers.DefaultRouter()
router.register(r'movies', views.MovieViewSet)
urlpatterns = [
path('', include(router.urls)),
path('admin/', admin.site.urls),
]
views.py:
class MovieViewSet(viewsets.ModelViewSet):
queryset = Movie.objects.all()
serializer_class = MovieSerializer
def create(self, request, *args, **kwargs):
title = request.data.get('title')
if not title:
return Response({'Error': "Body should be {'title':'The title of the Movie'}"}, status=status.HTTP_400_BAD_REQUEST)
data = get_data_from_omdb(title)
if len(data) == 0:
return Response({"Error": "Title does not exist in OMDB database"}, status=status.HTTP_400_BAD_REQUEST)
serializer = MovieSerializer(data=data, context={'request': request})
if serializer.is_valid(raise_exception=False):
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
感谢 Ozgur Akcali 的评论,找到了问题。我无法获取电影,因为电影 object 是根据来自外部 API 的数据创建的,包括标题。
"Hire me!" -> "Hire Me!"
有时候写脚本让我想杀人。非常感谢,抱歉浪费您的时间。
def test_correct_request(self):
title = 'Hire Me!' # was: 'Hire me!'
response = self.client.post('/movies/', data={'title': title}, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertTrue(Movie.objects.get(title=title))