【发布时间】: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