我的应用程序基于Django和DRF构建。我正在尝试使用类似于此结构的结构测试串行器:
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db',
'USER': 'user',
'PASSWORD': 'unbreakablepass',
'TEST': {
'NAME': 'test_db',
}
}
}
...
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)
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)
)
}
}
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定义。像这样更好一些,但仍然感觉太老套了。有什么好的做法吗?