在django中测试admin.ModelAdmin

ins*_*tor 32 django unit-testing django-admin

我试图找出测试的最佳方式admin.ModelAdminadmin.py.具体来说,我重写了save_model()我想测试的功能.根据我所做的研究,我发现的唯一解决方案是编写请求/响应测试,然后查询数据库.

Udi*_*Udi 40

查看Django的ModelAdminTests示例.


djv*_*jvg 13

正如Udi的答案所建议,我们可以研究Django自己的ModelAdmin测试,以确定测试的基本要素ModelAdmin。总结如下:

基本成分

除了Django外TestCase,基本要素还包括:

  1. 的实例AdminSite

    from django.contrib.admin.sites import AdminSite
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您的模型类和相应的ModelAdmin(子)类:

    from my_app.models import MyModel
    from my_app.admin import MyModelAdmin
    
    Run Code Online (Sandbox Code Playgroud)
  3. (可选)根据您的需要,提供(模拟)请求和/或表格。

食谱

创建您的(自定义)实例需要前两个成分ModelAdmin

my_model_admin = MyModelAdmin(model=MyModel, admin_site=AdminSite())
Run Code Online (Sandbox Code Playgroud)

基于ModelAdmin源,默认save_model实现仅需要模型的实例,因此可以按如下方式调用它:

my_model_admin.save_model(obj=MyModel(), request=None, form=None, change=None)
# some test assertions here
Run Code Online (Sandbox Code Playgroud)

这完全取决于您的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
Run Code Online (Sandbox Code Playgroud)

MockRequest下面定义了一个示例。基于Django测试源,最少的代码requestobject具有user属性的Python组成。根据您的需要,该user属性可以引用模拟用户或您的实际实例AUTH_USER_MODEL

class MockRequest(object):
    def __init__(self, user=None):
        self.user = user
Run Code Online (Sandbox Code Playgroud)

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


mad*_*han 6

您可以为 modeladmin 指定自定义模型表单,然后简单地测试此模型表单;)

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

形式

class SomeModelForm(forms.ModelForm):
    class Meta:
        model = SomeModel
Run Code Online (Sandbox Code Playgroud)

行政

class SomeModelAdmin(admin.ModelAdmin):
    form = SomeModelForm


admin.site.register(SomeModel, SomeModelAdmin)
Run Code Online (Sandbox Code Playgroud)

测试

class TestSomeModel(TestCase):
    def test_form(self):
        form = SomeModelForm(**kwargs)
        self.assertTrue(form.is_valid())
        # ...
Run Code Online (Sandbox Code Playgroud)

  • 请记住,这并不能可靠地测试**保存**对象。 (7认同)