在Django中创建用于测试未管理模型的临时表
我有一个django应用程序,它有两个模型,可以从非托管数据库中的表读取数据 我只是尝试适当地创建测试,以确保应用程序能够得到尽可能好的测试。我正在使用factory_boy来帮助创建测试数据 我的一个非托管模型如下所示:在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(
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
创建模拟数据并进行测试