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

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

【问题讨论】:

    标签: django unit-testing django-admin


    【解决方案1】:

    按照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 包含一个带有 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 以获取示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-21
        • 1970-01-01
        • 2015-08-23
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多