在django中测试admin.ModelAdmin

时间:2011-06-27 20:21:42

标签: django unit-testing django-admin

我正在尝试找出在admin.ModelAdmin中测试admin.py的最佳方法。具体来说,我正在覆盖我要测试的save_model()函数。根据我所做的研究,我发现的唯一解决方案是编写请求/响应测试,然后查询数据库。

4 个答案:

答案 0 :(得分:38)

查看Django的ModelAdminTests示例。

答案 1 :(得分:8)

根据Udi's answer中的建议,我们可以研究Django自己的ModelAdmin tests,以确定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由具有object属性的Python user组成。 根据您的需要,user属性可以引用mock userAUTH_USER_MODEL的实际实例。

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

此基本方法也适用于其他ModelAdmin方法。

答案 2 :(得分:2)

我遇到了类似的问题所以我在这里写了一个小帮手:https://github.com/metzlar/djest

答案 3 :(得分:2)

您可以为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())
        # ...