我正在尝试找出在admin.ModelAdmin
中测试admin.py
的最佳方法。具体来说,我正在覆盖我要测试的save_model()
函数。根据我所做的研究,我发现的唯一解决方案是编写请求/响应测试,然后查询数据库。
答案 0 :(得分:38)
查看Django的ModelAdminTests
示例。
答案 1 :(得分:8)
根据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
由具有object
属性的Python user
组成。
根据您的需要,user
属性可以引用mock user或AUTH_USER_MODEL
的实际实例。
class MockRequest(object):
def __init__(self, user=None):
self.user = user
此基本方法也适用于其他ModelAdmin
方法。
答案 2 :(得分:2)
我遇到了类似的问题所以我在这里写了一个小帮手:https://github.com/metzlar/djest
答案 3 :(得分: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())
# ...