Подтвердить что ты не робот

Тестирование admin.ModelAdmin в django

Я пытаюсь найти лучший способ для тестирования admin.ModelAdmin в admin.py. В частности, я переопределяю save_model() которую я хочу протестировать. Из проведенного мною исследования единственным решением, которое я нашел, было написание теста "запрос/ответ" и последующий запрос к базе данных.

4b9b3361

Ответ 1

Ознакомьтесь с примерами Django ModelAdminTests.

Ответ 2

Как предлагается в ответе Udi, мы можем изучить собственные тесты ModelAdmin в Django, чтобы определить основные компоненты для теста ModelAdmin. Вот краткое изложение:

Основные ингредиенты

В дополнение к Django TestCase, основными ингредиентами являются:

  1. Экземпляр AdminSite:

    from django.contrib.admin.sites import AdminSite
    
  2. Класс вашей модели и соответствующий (под) класс ModelAdmin:

    from my_app.models import MyModel
    from my_app.admin import MyModelAdmin
    
  3. По желанию, в зависимости от ваших потребностей, (макет) запроса и/или формы.

Рецепт

Первые два компонента необходимы для создания экземпляра вашего (пользовательского) ModelAdmin:

my_model_admin = MyModelAdmin(model=MyModel, admin_site=AdminSite())

Основываясь на источнике save_model реализации save_model по умолчанию save_model только экземпляр вашей модели, поэтому его можно вызвать, например, следующим образом:

my_model_admin.save_model(obj=MyModel(), request=None, form=None, change=None)
# some test assertions here

Все зависит от того, что делает ваш save_model, и что вы хотите проверить. Предположим, ваш save_model проверяет права пользователя, затем вам нужно будет передать запрос (т. save_model Третий ингредиент) действительному пользователю, в дополнение к экземпляру модели:

super_user = User.objects.create_superuser(username='super', email='[email protected]',
                                           password='pass')
my_model_admin.save_model(obj=MyModel(), request=MockRequest(user=super_user),
                          form=None, change=None)
# some test assertions here

Пример MockRequest определен ниже. Основанный на тестовом источнике Django, минимальный request состоит из object Python с атрибутом user. Атрибут user может ссылаться на фиктивного пользователя или на фактический экземпляр вашего AUTH_USER_MODEL, в зависимости от ваших потребностей.

class MockRequest(object):
    def __init__(self, user=None):
        self.user = user

Этот базовый подход применим и к другим методам ModelAdmin.

Ответ 3

У меня была аналогичная проблема, поэтому я написал крошечного помощника здесь: https://github.com/metzlar/djest

Ответ 4

Вы можете указать пользовательскую модель модели для modeladmin, а затем просто протестировать эту модельную форму;)

https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form

формы

class SomeModelForm(forms.ModelForm):
    class Meta:
        model = SomeModel

админ

class SomeModelAdmin(admin.ModelAdmin):
    form = SomeModelForm


admin.site.register(SomeModel, SomeModelAdmin)

Тесты

class TestSomeModel(TestCase):
    def test_form(self):
        form = SomeModelForm(**kwargs)
        self.assertTrue(form.is_valid())
        # ...