创建临时表以在Django中测试非托管模型

时间:2018-09-07 14:46:47

标签: django testing django-models django-testing factory-boy

我有一个django应用程序,该应用程序具有从非托管数据库中的表读取的几个模型。

我只是在尝试适当地创建测试,以确保可以对应用程序进行尽可能好的测试。我正在使用factory_boy协助创建测试数据。

我的一个非托管模型如下:

class EmpGroup(models.Model):
    id = models.IntegerField(db_column='id', primary_key=True)
    staff_group = models.ForeignKey(
        StaffGroup,
        db_column='staff_group_id',
        on_delete=models.PROTECT
    )
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        db_column='user_id',
        on_delete=models.PROTECT
    )
    location = models.ForeignKey(
        Location,
        db_column='base_loc',
        on_delete=models.PROTECT
    )
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    location_name = models.CharField(max_length=50)

    def __str__(self):
        return f'{self.last_name}, {self.first_name}'

    class Meta(object):
        managed = getattr(settings, 'UNDER_TEST', False)
        db_table = 'control_v_empGroup'

由于该模型是不受管的-设置测试数据库时,没有迁移可告诉模型创建表control_v_empGroup。因此,当我运行测试时-我得到表不存在的错误!

我的EmpGroupFactory看起来像这样:

class EmpGroupFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = models.EmpGroup

    id = 1
    staff_group = factory.SubFactory(StaffGroupFactory)
    user = factory.SubFactory(UserFactory)
    location = factory.SubFactory(LocationFactory)
    first_name = 'Test'
    last_name = 'Grp'
    location_name = 'Test'

在我的设置中,我有这个:

UNDER_TEST = (len(sys.argv) > 1 and sys.argv[1] == 'test')
if UNDER_TEST:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'default-db.sqlite3'),
        },
        'camp': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'camp-db.sqlite3'),
        },
    }
else:
    DATABASES =
    # actual dbs for regular use

我设置了UNDER_TEST,以便可以在测试时将数据库与非文本示例中的常规数据库区分开。测试数据库是SQLlite。

是否有一种方法可以在测试时强制Django为该特定模型设置表,而在其他时候则不能?

测试非托管模型的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我最终使用Pytest-Django,因为该测试框架实际上可以执行我想要的事情。

使用--nomigrations标志,将仅在测试中由django管理的模型带入我的模型,并在测试数据库中为其创建适当的表名。然后,我可以使用factory_boy创建模拟数据并进行测试!