Как полностью протестировать Django ImportMixin через excel

У меня есть модель администратора, которая использует django-import-export через файл excel обычно. Я хочу протестировать его как можно тщательнее. Я могу проверить формат файла & заголовки должны быть такими, как ожидалось, а также виджеты, используемые ресурсом, который управляет проверкой импорта. Однако я вношу некоторые изменения в данные, когда они сохраняются & импортируются, и я не могу понять, как проверить это с помощью приведенного ниже метода или через selenium, поскольку это связано с файлом excel. Что посоветуете? Я хотел бы проверить, что при импорте через excel вступают в силу вещи, которые я делаю в ресурсе, а именно: я загружаю пользователей и добавляю их в группы, но метод тестирования ниже только проверяет правильность настройки набора данных, он не создает никаких записей. Я также использую Selenium для тестирования функциональности пользователей, но не нашел, как я могу имитировать файл excel.

from import_export.admin import ImportMixin

class CustomUserAdmin(ImportMixin, UserAdmin):
    # this resource controls the custom checks for the import mixin
    resource_class = UserResource

Фрагмент ресурса, который я использую, использует несколько виджетов для управления валидацией

class UserResource(resources.ModelResource):
id = fields.Field(column_name='id', attribute='id')  # only here to keep the id on the left, preference
username = fields.Field(widget=UsernameWidget(), column_name='username', attribute='username')
# we use a custom field, so we can hash the password without showing it to the user
user_password = fields.Field(widget=PasswordWidget(), column_name='user_password', attribute='user_password')
email = fields.Field(widget=RequiredWidget(), column_name='email', attribute='email')
first_name = fields.Field(column_name='first_name', attribute='first_name')
last_name = fields.Field(column_name='last_name', attribute='last_name')
role = fields.Field(widget=RoleWidget(), column_name='role', attribute='role')

class Meta:
    model = User
    exclude = ('last_login', 'is_superuser', 'user_permissions', 'is_active', 'date_joined', 'password', 'groups', 'is_staff',)
    fields = ('id', 'username', 'user_password', 'email', 'role', 'first_name', 'last_name',)

Вот фрагмент того, как я тестирую некоторые валидаторы/виджеты

    def test_role_must_be_one_of_3_choices(self):
    rows = [
        [1, 'username', 'user_password', 'email@email.com', 'admin', '', ''],
        [1, 'username1', 'user_password', 'email@email.com', 'competitor', '', ''],
        [1, 'username2', 'user_password', 'email@email.com', 'judge', '', ''],
        [1, 'username3', 'user_password', 'email@email.com', 'wrong', '', ''],
    ]

    dataset = tablib.Dataset(*rows, headers=self.headers)
    result = self.resource.import_data(
        dataset, dry_run=True, use_transactions=True,
        collect_failed_rows=True,
    )
    # we should get 1 good row & 1 failed row
    self.assertEqual(len(result.failed_dataset), 1)
    self.assertEqual(len(result.valid_rows()), 3)

Посмотрите на последнюю ветку v3. Там есть много примеров тестов. Я предполагаю, что вам понадобятся юнит-тесты для ваших пользовательских виджетов и интеграционные тесты для вашей сквозной логики.

Сам источник включает интеграционные тесты, которые загружают данные из исходного файла (например, Excel) и обрабатывают их через импорт. Вы можете адаптировать это для чтения из исходного файла, выполнения импорта, а затем чтения объектов обратно непосредственно из базы данных, чтобы убедиться, что они находятся в правильном состоянии.

Убедитесь, что вы тестируете с v3 beta, так как это станет последней версией библиотеки в следующем месяце или около того.

Вернуться на верх