【问题标题】:Django Restapi - How to test if POST saves data in database?Django Rest Api - 如何测试 POST 是否将数据保存在数据库中?
【发布时间】:2019-03-16 17:53:16
【问题描述】:

所以我发现了这个问题: Django Rest Framework testing save POST request data

而且我知道只要函数正在运行,使用 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)

【问题讨论】:

  • 向我们展示urls.pyviews.py of /movies/
  • 添加了 Urls.py 和 Views.py。
  • 你确定 Movie.objects.all() 返回一个 epmty 查询集吗?因为在查看代码时,如果第一个断言 (self.assertEqual(response.status_code, status.HTTP_201_CREATED)) 通过,则应保存对象。此外,在测试方面,当您通过 api 创建对象时,最好测试对象是通过 api 创建的,即通​​过发出检索或列表请求
  • 你是对的,问题解决了。嗯。关于测试 - 我不应该分别测试 POST 和 GET 吗?并使用最基本和最可靠的方法来测试东西(在这种情况下,model.objects.get())?我也那么认为。但也许你是对的,我可能会更早注意到这个问题......

标签: django django-rest-framework django-testing


【解决方案1】:

感谢 Ozgur Akcali 的评论发现了问题。我无法获取电影,因为 Movie 对象是根据来自外部 API 的数据(包括标题)创建的。

“雇用 me!” -> “雇用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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2019-08-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多