Python / Django — как заставить все методы в классе unittest использовать одну и ту же базу данных?

Это мой код:

Ссылка на мой импорт находится здесь: https://github.com/django/django/blob/master/django/core/urlresolvers.py https://github.com/django/django/blob/master/django/contrib/auth/models.py https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/status.py https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/test.py

from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
from rest_framework import status
from rest_framework.test import APITestCase

class UserTests(APITestCase):
    def test_create_user(self):
        """
        Ensure we can create a new user object.
        """
        url = reverse('user-list')
        data = {'username': 'a', 'password': 'a', 'email': '[email protected]'}
        # Post the data to the URL to create the object
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        # Check the database to see if the object is created.
        # This check works.
        self.assertEqual(User.objects.count(), 1)

    def test_get_user(self):
        """
        Ensure we can get a list of user objects.
        """
        # This fails and returns an error
        self.assertEqual(User.objects.count(), 1)

Когда я запускаю тест, он выдает ошибку AssertionError: 0 != 1, потому что в функции test_get_user пользователь, созданный в test_create_user, не виден. Есть ли способ заставить все методы в классе совместно использовать одну и ту же базу данных, чтобы, если я создам пользователя в test_create_user, я мог получить к нему доступ в методах, которые идут ниже?

Изменить: причина, по которой я хочу, чтобы они использовали одну и ту же базу данных для всех методов, заключается в том, что для всех моих тестовых случаев в классе UserTests потребуется создать пользователя, поэтому я не хочу постоянно повторять один и тот же код, даже когда это проверено в test_create_user.

Я знаю, что могу использовать def setUp(self), но я выполняю тест «создать пользователя» в своем первом методе, поэтому я хочу иметь возможность проверить, могу ли я сначала создать его, прежде чем создавать его в def setUp(self).


person SilentDev    schedule 24.10.2015    source источник
comment
Пожалуйста, добавьте APITestCase и ваш импорт.   -  person Sebastian Wozny    schedule 25.10.2015
comment
Я думаю, что проще создать отдельный тестовый пример для пользователя unittest. В основном это тестировало бы код для создания пользователей, которые можно было бы использовать для предварительного заполнения БД в других тестовых примерах.   -  person Ivan    schedule 25.10.2015
comment
@SebastianWozny Я добавил ссылку на исходный код GitHub (это исходный код Django и DRF по умолчанию).   -  person SilentDev    schedule 25.10.2015
comment
@Ivan Хм, что именно ты имеешь в виду? Вы говорите, что я создаю свой собственный класс для модульного тестирования test_create_user, а затем отдельный класс для модульного тестирования всего остального, что зависит от создания пользователя (чтобы я мог просто создать пользователя в методе def setUp(self)?).   -  person SilentDev    schedule 25.10.2015
comment
Вот именно, не стоит пытаться уместить все в один TestCase.   -  person Ivan    schedule 25.10.2015
comment
@Ivan Дело в том, что я хочу поместить каждый тестовый набор, который тестирует модель User (GET User, CREATE User, PATCH User, PUT User и DELETE User), в один класс, поскольку все они связаны.   -  person SilentDev    schedule 25.10.2015
comment
Затем добавьте служебные методы для повторного использования кода создания объекта, как это предлагается в комментарии @DanielRoseman.   -  person Ivan    schedule 25.10.2015


Ответы (1)


Вы должны настроить свои данные явно в каждом тесте. Тесты не должны зависеть друг от друга.

person Daniel Roseman    schedule 24.10.2015
comment
В моей ситуации (см. мое редактирование внизу моего поста) вы бы по-прежнему рекомендовали повторно использовать одну и ту же часть кода (часть, где я создаю пользователя) снова и снова во всех моих методах? Или есть лучший способ сделать это? Примечание. Я не хочу создавать пользователя в def setUp(self), потому что я хочу иметь возможность проверить, могу ли я сначала создать пользователя, прежде чем создавать его (тест выполняется в первом методе — def test_create_user(self). - person SilentDev; 25.10.2015
comment
Нет, вы можете просто создать объект напрямую через ORM; нет необходимости проходить через почту, если вы специально не тестируете это. Но вы, конечно, можете поместить это в отдельный служебный метод, если хотите. - person Daniel Roseman; 25.10.2015