在Django中创建用于测试未管理模型的临时表

在Django中创建用于测试未管理模型的临时表,django,testing,django-models,django-testing,factory-boy,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(

我有一个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'
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'
因为该模型是非托管的-在设置测试数据库时,没有迁移告诉它创建表
control\u v\u empGroup
。所以当我运行我的测试时,我得到的错误是表不存在

我的EmpGroupFactory如下所示:

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'
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
我在_TEST下设置
,以便在测试时将数据库与非文本示例中的常规数据库区分开来。测试数据库是SQLlite

有没有办法在测试时强制Django为该特定模型设置一个表,而不是在其他时间


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

我最终使用了
Pytest-Django
,因为该测试框架实际上允许做我想要的事情

使用
--nomigrations
标志,它接受仅由django在测试中管理的模型,并在测试数据库中为它们创建适当的表名。然后我可以使用
factory\u boy
创建模拟数据并进行测试