Мое приложение построено поверх 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.Вроде как этот лучше, но все же чувствует себя слишком хакерским.
Есть ли хорошая практика, как это сделать?