在 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 object
。
user
属性可以引用 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的主要内容,如果未能解决你的问题,请参考以下文章