【发布时间】:2011-09-23 19:38:17
【问题描述】:
我正在尝试找出在admin.py 中测试admin.ModelAdmin 的最佳方法。具体来说,我正在覆盖我想要测试的save_model() 函数。根据我所做的研究,我发现的唯一解决方案是编写请求/响应测试,然后查询数据库。
【问题讨论】:
标签: django unit-testing django-admin
我正在尝试找出在admin.py 中测试admin.ModelAdmin 的最佳方法。具体来说,我正在覆盖我想要测试的save_model() 函数。根据我所做的研究,我发现的唯一解决方案是编写请求/响应测试,然后查询数据库。
【问题讨论】:
标签: django unit-testing django-admin
按照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 方法。
【讨论】:
您可以为 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())
# ...
【讨论】:
我遇到了类似的问题,所以我在这里写了一个小助手:https://github.com/metzlar/djest
【讨论】:
查看 Django 的 ModelAdminTests 以获取示例。
【讨论】: