Я пытаюсь найти лучший способ для тестирования admin.ModelAdmin
в admin.py
. В частности, я переопределяю save_model()
которую я хочу протестировать. Из проведенного мною исследования единственным решением, которое я нашел, было написание теста "запрос/ответ" и последующий запрос к базе данных.
Тестирование admin.ModelAdmin в django
Ответ 1
Ознакомьтесь с примерами Django ModelAdminTests
.
Ответ 2
Как предлагается в ответе Udi, мы можем изучить собственные тесты ModelAdmin в Django, чтобы определить основные компоненты для теста ModelAdmin
. Вот краткое изложение:
Основные ингредиенты
В дополнение к Django TestCase
, основными ингредиентами являются:
-
Экземпляр
AdminSite
:from django.contrib.admin.sites import AdminSite
-
Класс вашей модели и соответствующий (под) класс
ModelAdmin
:from my_app.models import MyModel from my_app.admin import MyModelAdmin
-
По желанию, в зависимости от ваших потребностей, (макет) запроса и/или формы.
Рецепт
Первые два компонента необходимы для создания экземпляра вашего (пользовательского) 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())
# ...