I am trying to find out the best way for testing admin.ModelAdmin
in admin.py
. Specifically I am overriding the save_model()
function which I want to test. From the research I have done, the only solution I have found was writing a request/response test and then query the database.
One of the most powerful parts of Django is the automatic admin interface. It reads metadata from your models to provide a quick, model-centric interface where trusted users can manage content on your site. The admin's recommended use is limited to an organization's internal management tool.
To view the default admin template you can access it in the django/contrib/admin/templates/admin folder.
As suggested in Udi's answer, we can study Django's own ModelAdmin tests, to determine the basic ingredients for a ModelAdmin
test. Here's a summary:
In addition to the Django TestCase
stuff, the basic ingredients are:
An instance of AdminSite
:
from django.contrib.admin.sites import AdminSite
Your model class and corresponding ModelAdmin
(sub)class:
from my_app.models import MyModel from my_app.admin import MyModelAdmin
Optionally, depending on your needs, a (mock) request and/or form.
The first two ingredients are required to create an instance of your (custom) ModelAdmin
:
my_model_admin = MyModelAdmin(model=MyModel, admin_site=AdminSite())
Based on the ModelAdmin source, the default save_model
implementation only requires an instance of your model, so it can be called, for example, as follows:
my_model_admin.save_model(obj=MyModel(), request=None, form=None, change=None) # some test assertions here
It all depends on what your save_model
does, and what you want to test. Suppose your save_model
checks user permissions, then you would need to pass a request (i.e. the third ingredient) with a valid user, in addition to the model instance:
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
An example of the MockRequest
is defined below. Based on the Django test source, a minimal request
consists of a Python object
with a user
attribute. The user
attribute may refer to a mock user, or an actual instance of your AUTH_USER_MODEL
, depending on your needs. An alternative would be to use django.test.RequestFactory.
class MockRequest(object): def __init__(self, user=None): self.user = user
This basic approach applies to the other ModelAdmin
methods as well.
Check out Django's ModelAdminTests
for examples.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With