2015-03-26 2 views
0

Я пишу несколько тестов для моей платформы Django Rest и стараюсь, чтобы они были максимально простыми. Раньше я создавал объекты, используя заводского мальчика, чтобы сохранить объекты, доступные для запросов GET.Django Rest Framework тестирование сохраняет данные запроса POST

Почему мои запросы POST в тестах не создают фактический объект в моей тестовой базе данных? Все работает отлично, используя фактический API, но я не могу получить POST в тестах, чтобы сохранить объект, чтобы он был доступен для запросов GET. Есть что-то, что мне не хватает?

from rest_framework import status 
from rest_framework.test import APITestCase 

# from .factories import InterestFactory 


class APITestMixin(object): 
    """ 
    mixin to perform the default API Test functionality 
    """ 
    api_root = '/v1/' 
    model_url = '' 
    data = {} 

    def get_endpoint(self): 
     """ 
     return the API endpoint 
     """ 
     url = self.api_root + self.model_url 
     return url 

    def test_create_object(self): 
     """ 
     create a new object 
     """ 
     response = self.client.post(self.get_endpoint(), self.data) 
     self.assertEqual(response.status_code, status.HTTP_201_CREATED) 
     self.assertEqual(response.data, self.data) 
     # this passes the test and the response says the object was created 

    def test_get_objects(self): 
     """ 
     get a list of objects 
     """ 
     response = self.client.get(self.get_endpoint()) 
     self.assertEqual(response.status_code, status.HTTP_200_OK) 
     self.assertEqual(response.data, self.data) 
     # this test fails and says the response is empty [] with no objects 


class InterestTests(APITestCase, APITestMixin): 
    def setUp(self): 
     self.model_url = 'interests/' 
     self.data = { 
      'id': 1, 
      'name': 'hiking', 
     } 

     # self.interest = InterestFactory.create(name='travel') 
     """ 
     if I create the object with factory boy, the object is 
     there. But I don't want to have to do this - I want to use 
     the data that was created in the POST request 
     """ 

Вы можете увидеть пару строк закомментированного кода, которые объект, который нужно создать через фабричной мальчика, так как объект не получает создан и сохранен (хотя тест создания делает проход и сказать объект создается).

Я не размещал ни один из кода модели, сериализатора или вида, потому что фактический API работает, это вопрос, специфичный для теста.

+0

Содержимое базы данных очищается между каждым методом тестирования. Вам нужен выделенный вспомогательный метод для создания объектов и повторного использования в каждом тестовом случае. – mariodev

ответ

4

Прежде всего, Джанго TestCase (APITestCase «ы базовый класс) охватывает тестовый код в транзакции базы данных, откат в конце теста (refer). Вот почему test_get_objects не может видеть объекты, созданные в test_create_object

Тогда из (Django Testing Docs)

Имея тесты, изменяющих друг друга данные, или имеющие тесты, которые зависят от других данных испытаний, изменяющих по своей природе хрупки.

Первая причина в том, что вы не можете положиться на порядок выполнения тестов. На данный момент порядок в TestCase кажется алфавитным. test_create_object только что исполнилось до test_get_objects. Если вы измените имя метода на test_z_create_object, то test_get_objects будет первым. Поэтому лучше, чтобы сделать каждый тест независимой

решения для Вашего случая, если вы все равно не хотите сбросить базу данных после каждого теста, используйте APISimpleTestCase

Более рекомендуемые тесты группы. Например, переименовать test_create_object, test_get_objects - subtest_create_object, subtest_get_objects. Затем создайте другой метод тестирования, чтобы вызвать два теста по мере необходимости

+0

Спасибо. Да, все имеет смысл, в других сценариях я вызывал тест create в тесте get object и обнаружил, что это работает. Я думал, что база данных была очищена в конце каждого класса TestCase, а не в конце каждой функции. – awwester

+0

Жаль, что я не смог бы проголосовать за этот ответ больше. Спасибо, теперь я понимаю! – Prometheus

Смежные вопросы