Django Restapi - Как проверить, сохраняет ли POST данные в базе данных? - PullRequest
0 голосов
/ 16 марта 2019

Итак, я нашел этот вопрос: Тестирование Django Rest Framework сохранить данные POST-запроса

И я понял, что данные, созданные с помощью запроса 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 в той же функции. API работает нормально, когда я запускаю `manage.py runserver 'и тестирую его в браузере. Но как написать правильный тест, чтобы проверить, действительно ли данные сохранены в базе данных?

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)

1 Ответ

1 голос
/ 16 марта 2019

Обнаружил проблему благодаря комментарию Озгура Аккали. Я не смог получить фильм, потому что объект Movie был создан на основе данных из внешнего API, включая заголовок.

"Прокат м е!» -> «Нанимай М е!»

Иногда скрипты заставляют меня хотеть убить. Большое спасибо и извините за потраченное время.

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))
...