Django测试导入了来自真实数据库的内容类型值

时间:2019-09-25 00:36:35

标签: python django testing django-rest-framework

我的应用程序基于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时,它们是在测试数据库建立之前导入的。现在,我的相关字段的queryset属性中的ContentType值将使用来自主数据库(而非测试数据库)的ContentType值进行过滤。因此,如果我的测试尝试在相关字段中使用任何值,则将失败。

显而易见的选择似乎是:

  • 将串行器导入测试代码中。我真的不喜欢这个此外,许多不同的测试都可以使用串行器。
  • 在我的settings.py中使用一些技巧,例如if 'test' in sys.argv:,然后更改DATABASES定义。像这样更好一些,但仍然感觉太老套了。

有什么好的做法吗?

0 个答案:

没有答案