Создать временную таблицу для тестирования неуправляемой модели в Django - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть приложение 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 настроить таблицу для этой конкретной модели при тестировании, но не в другое время?

Как лучше всего тестировать неуправляемые модели?

1 Ответ

0 голосов
/ 19 сентября 2018

В итоге я использовал Pytest-Django, поскольку эта среда тестирования фактически позволяет делать именно то, что я хотел.

Используя флаг --nomigrations, он берет мои модели, которые управляются только django в тестах, и создает соответствующее имя таблицы для них в тестовой базе данных. Тогда я могу использовать factory_boy, чтобы создать фиктивные данные и проверить их!

...