it-roy-ru.com

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

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

30
instigator

Проверьте Django's ModelAdminTests для примеров.

37
Udi

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

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

формы

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

admin

class SomeModelAdmin(admin.ModelAdmin):
    form = SomeModelForm


admin.site.register(SomeModel, SomeModelAdmin)

tests

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

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

1
Ivanhoe

Как предлагается в ответ Уди , мы можем изучить собственные тесты Django ModelAdmin , чтобы определить основные ингредиенты для теста 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())

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

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

Все зависит от того, что делает ваш 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 состоит из Python object с атрибутом user. Атрибут user может ссылаться на mock user или на фактический экземпляр вашего AUTH_USER_MODEL, в зависимости от ваших потребностей. 

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

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

0
djvg