testing admin.ModelAdmin in django

我与影子孤独终老i 提交于 2020-04-07 12:42:27

问题


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.


回答1:


Check out Django's ModelAdminTests for examples.




回答2:


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:

Basic ingredients

In addition to the Django TestCase stuff, the basic ingredients are:

  1. An instance of AdminSite:

    from django.contrib.admin.sites import AdminSite
    
  2. Your model class and corresponding ModelAdmin (sub)class:

    from my_app.models import MyModel
    from my_app.admin import MyModelAdmin
    
  3. Optionally, depending on your needs, a (mock) request and/or form.

Recipe

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='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

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.

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

This basic approach applies to the other ModelAdmin methods as well.




回答3:


I had a similar problem so I wrote a tiny little helper here: https://github.com/metzlar/djest




回答4:


You can specify custom modelform for modeladmin then simply test this modelform ;)

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

forms

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())
        # ...


来源:https://stackoverflow.com/questions/6498488/testing-admin-modeladmin-in-django

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!