我有一个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为该特定模型设置表,而在其他时候则不能?
测试非托管模型的最佳方法是什么?
答案 0 :(得分:0)
我最终使用Pytest-Django
,因为该测试框架实际上可以执行我想要的事情。
使用--nomigrations
标志,将仅在测试中由django管理的模型带入我的模型,并在测试数据库中为其创建适当的表名。然后,我可以使用factory_boy
创建模拟数据并进行测试!