python - Django 测试导入使用来自真实数据库的内容类型值
问题描述
我的应用程序建立在 Django 和 DRF 之上。我正在尝试测试具有类似于此结构的序列化程序:
设置.py
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db',
'USER': 'user',
'PASSWORD': 'unbreakablepass',
'TEST': {
'NAME': 'test_db',
}
}
}
...
模型.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)
序列化程序.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)
)
}
}
测试.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
。queryset
现在,我的相关字段属性中的 ContentType 值使用ContentType
来自主数据库的值进行过滤,而不是测试数据库。因此,如果他们尝试使用相关字段中的任何值,我的测试将失败。
显而易见的选择似乎是:
- 在测试代码中导入序列化程序。我真的不喜欢这个。此外,许多不同的测试可能会使用序列化程序。
settings.py
在我的示例中使用一些技巧if 'test' in sys.argv:
并更改 DATABASES 定义。有点像这个更好,但仍然感觉太hacky。
关于如何做到这一点有什么好的做法吗?