Импорт тестов Django использует значения типа контента из реальной базы данных - PullRequest
1 голос
/ 25 сентября 2019

Мое приложение построено поверх Django и DRF.Я пытаюсь протестировать сериализатор со структурой, подобной этой:

settings.py

...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db',
        'USER': 'user',
        'PASSWORD': 'unbreakablepass',
        'TEST': {
            'NAME': 'test_db',
        }
    }
}
...

models.py

class Status(models.Model):
    name = models.CharField(verbose_name=_('name'), max_length=150)
    order = models.PositiveIntegerField(verbose_name=_('order'), default=0)
    content_type = models.ForeignKey(ContentType)

class Task(models.Model):
    status = models.ForeignKey(Status)

serializers.py

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ['status']
        extra_kwargs = {
            'status': {
                'queryset': Status.objects.filter(
                    content_type=ContentType.objects.get_for_model(Task)
                )
            }
        }


tests.py

from myapp.serializers import TaskSerializer
from myapp.models import Task

class TaskTestCase(TestCase):
    def test_content_type(self):
        # Do something with ContentType.objects.get_for_model(Task)
        ...

Моя проблема заключается в том, что, поскольку сериализаторы импортируются в tests.py, они импортируются до настройки тестовой базы данных при запуске manage.py test --keepdb.Теперь значение ContentType в атрибуте queryset моего связанного поля фильтруется значениями ContentType из основной базы данных, а не из тестовой базы данных.Поэтому мои тесты не пройдут, если они попытаются использовать какое-либо значение в связанном поле.

Кажется очевидным выбор:

  • Импортировать сериализатор внутри кода тестирования.Мне действительно не нравится это.Кроме того, во многих различных тестах может использоваться сериализатор.
  • Используйте некоторые взломы в моем settings.py, например if 'test' in sys.argv:, и измените определение DATABASES.Вроде как этот лучше, но все же чувствует себя слишком хакерским.

Есть ли хорошая практика, как это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...