测试管理django中的ModelAdmin

2fjabf4q  于 2023-01-14  发布在  Go
关注(0)|答案(3)|浏览(114)

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

wlp8pajw

wlp8pajw1#

正如Udi's answer中所建议的,我们可以研究Django自己的ModelAdmin tests,以确定ModelAdmin测试的基本要素。

基本成分

除了Django TestCase的东西,基本成分是:

  1. AdminSite的示例:
from django.contrib.admin.sites import AdminSite

1.您的模型类和对应的ModelAdmin(子)类:

from my_app.models import MyModel
 from my_app.admin import MyModelAdmin

1.根据您的需要,还可以选择(模拟)请求和/或表单。

配方

创建(自定义)ModelAdmin的示例需要前两个要素:

my_model_admin = MyModelAdmin(model=MyModel, admin_site=AdminSite())

基于ModelAdmin源代码,默认的save_model实现只需要模型的一个示例,因此可以调用它,例如,如下所示:

my_model_admin.save_model(obj=MyModel(), request=None, form=None, change=None)
# some test assertions here

这完全取决于您的save_model做什么,以及您想要测试什么。假设您的save_model检查用户权限,那么您需要提供一个request(即第三个要素),除了模型示例之外,还需要提供一个有效的用户:

from unittest.mock import Mock

...

my_user = User.objects.create(...)
my_model_admin.save_model(
    obj=MyModel(), request=Mock(user=my_user), form=None, change=None
)
# some test assertions here

这里我们使用unittest.mock.Mock来创建一个模拟请求。基于Django测试源代码,一个最小的request由一个Python object和一个user属性组成。user属性可以引用一个模拟用户,或者你的AUTH_USER_MODEL的一个actual instance,这取决于你的需要。一个替代方法是使用django. test. RequestFactory。
这种基本方法也适用于其他ModelAdmin方法。

mw3dktmi

mw3dktmi2#

查看Django的ModelAdminTests作为例子。

vxf3dgd4

vxf3dgd43#

您可以为modeladmin指定自定义的modelform,然后简单地测试这个modelform ;)
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())
        # ...

相关问题