在 django 中测试 admin.ModelAdmin

Posted

技术标签:

【中文标题】在 django 中测试 admin.ModelAdmin【英文标题】:testing admin.ModelAdmin in django 【发布时间】:2011-09-23 19:38:17 【问题描述】:

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

【问题讨论】:

【参考方案1】:

按照Udi's answer 的建议,我们可以研究Django 自己的ModelAdmin tests,以确定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())

基于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 包含一个带有 user 属性的 Python objectuser 属性可以引用 mock user,或 AUTH_USER_MODEL 的实际实例,具体取决于您的需要。另一种方法是使用django.test.RequestFactory。

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

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

【讨论】:

关于这个过程的很好的解释。【参考方案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())
        # ...

【讨论】:

请记住,这并不能可靠地测试保存对象。【参考方案3】:

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

【讨论】:

【参考方案4】:

查看 Django 的 ModelAdminTests 以获取示例。

【讨论】:

以上是关于在 django 中测试 admin.ModelAdmin的主要内容,如果未能解决你的问题,请参考以下文章

在 docker 中使用 selenium 运行 django 测试

Django单元测试中的Unicode

如何在 Django 中测试自定义模板标签?

在内存中运行 Django MySQL 测试

在PyCharm中运行Django测试

如何在 Django 中测试具有表单的视图?