Я пытаюсь найти лучший способ для тестирования 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())
# ...