тестирование admin.ModelAdmin в Django - PullRequest
31 голосов
/ 28 июня 2011

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

Ответы [ 4 ]

39 голосов
/ 28 июня 2011

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

8 голосов
/ 13 февраля 2019

Как указано в ответе Уди , мы можем изучить собственные тесты 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='super@email.org',
                                           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 может относиться к фиктивному пользователю или фактическому экземпляру вашего AUTH_USER_MODEL, в зависимости от ваших потребностей.

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

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

2 голосов
/ 21 мая 2015

Вы можете указать пользовательскую модель для 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())
        # ...
2 голосов
/ 21 февраля 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...