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

用工厂数据填充特定数据库以进行测试

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

    我为我所有的模特都创建了工厂,大多数情况下,工厂男孩都工作过 !

    我遇到的问题与在其中一个字段上使用管理器的特定非托管模型有关。

    class DailyRoll(StaffModel):
        id            = models.IntegerField(db_column='ID', primary_key=True)
        location_id   = models.IntegerField(db_column='locationID')
        grade         = models.CharField(db_column='grade', max_length=10)
        end_year      = models.IntegerField(db_column='endYear')
        run_date      = models.DateField(db_column='runDate')
        person_count = models.IntegerField(db_column='personCount')
        contained_count = models.IntegerField(db_column='containedCount')
        double_count = models.IntegerField(db_column='doubleCount')
        aide_count = models.IntegerField(db_column='aideCount')
        one_count = models.IntegerField(db_column='oneCount')
        bi_count = models.IntegerField(db_column='biCount')
        last_run_date = managers.DailyRollManager()
    
        class Meta(object):
            managed  = False
            db_table = '[DATA].[position_dailyRoll]'
    

    经理看起来是这样的:

    class DailyRollManager(models.Manager):
        def get_queryset(self):
            last_run_date = super().get_queryset().using('staff').last().run_date
            return super().get_queryset().using('staff').filter(
                run_date=last_run_date
            )
    

    我的工厂设置是这样的(目前非常基本,因为我只是想让它工作):

    class DailyRollFactory(factory.Factory):
        class Meta:
            model = staff.DailyRoll
    
        id = 1
        location_id = 1
        grade = 1
        end_year = 2019
        run_date = factory.fuzzy.FuzzyDateTime(timezone.now())
        person_count = 210
        contained_count = 1
        double_count = 2
        aide_count = 3
        one_count = 4
        bi_count = 5
        last_run_date = managers.DailyRollManager()
    

    我肯定最后一次运行日期设置不正确-但我不知道如何最好地处理使用工厂的经理。

    当我运行测试时,它会创建一个名为'defaultdb'的默认sqlite3数据库来运行测试(我们在生产环境中使用SQL Server,但由于安全原因,我们不能让django控制master来管理测试)。为了实现这一点,我必须创建一个变通方法,但它是有效的。

    我的设置如下:

    if 'test' in sys.argv or 'test_coverage' in sys.argv:
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.sqlite3',
                'NAME': os.path.join(BASE_DIR, 'defaultdb.sqlite3'),
            },
            'staff': {
                'ENGINE': 'django.db.backends.sqlite3',
                'NAME': os.path.join(BASE_DIR, 'staff.sqlite3'),
            },
        }
    

    我的测试很简单:

    def test_index_returns_200_and_correct_template(self):
        """
        index page returns a 200
        """
        # Load test data which index needs
        # if this is not included the test fails with
        # 'no such table: [DATA].[position_dailyRoll]'
        f.DailyRollFactory()
        response = self.client.get(reverse('position:index'))
        self.assertEqual(response.status_code, 200)
        self.assertTemplateUsed(response, 'position/index.html')
    

    如果我不包括 f.DailyRollFactory()

    no such table: [DATA].[position_dailyRoll]
    

    当我包括 它给出了以下错误:

    TypeError: 'last_run_date' is an invalid keyword argument for this function
    

    我想,最终经理是在试图查看“员工”数据库-我已经创建了,但它是空的,不包含任何数据。

    A) 如何预填充 staff 数据库里有我工厂男孩模型里的数据吗?我 这也许能解决我遇到的问题。会吗?我不确定。

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

    最后我用了 Pytest-Django

    使用 --nomigrations db_table factory_boy 创建模拟数据并进行测试!

    推荐文章