【问题标题】:Create Temporary Table For Testing Unmanged Model in Django在 Django 中创建用于测试未管理模型的临时表
【发布时间】:2018-09-07 14:46:46
【问题描述】:

我有一个 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 在测试时为该特定模型设置表,但在其他时间不设置?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 2021-12-13
      • 2012-07-08
      • 2020-10-12
      相关资源
      最近更新 更多