代码之家  ›  专栏  ›  技术社区  ›  Hanny

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

  •  0
  • Hanny  · 技术社区  · 6 年前

    我有一个django应用程序,它有几个模型可以从非托管数据库中的表中读取数据。

    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 所以当我运行我的测试-我得到的错误是表不存在!

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

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Hanny    6 年前

    Pytest-Django 因为那个测试框架实际上允许我做我想做的事情。

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