如何为管理员保存功能编写单元测试

Eli*_*isa 7 python django django-unittest

我有自定义的save_model管理员即

class MyModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # some more question code here
        obj.save()
Run Code Online (Sandbox Code Playgroud)

现在,我想测试 MyModelAdminsave_model功能。我尝试发布如下:

class MyModelAdminSaveTestCase(TestCase):
    def setUp(self):

        # setup code here

    def test_save_model(self):
        '''Test add employee
        '''
        my_obj = {
            'name': 'Tester',
            'address': '12 test Test',
            'city': 'New York',
            'state': 'NY',
        }

        self.client.login(username=self.user, password=self.pwd)
        response = self.client.post(reverse('admin:mymodel_mymodel_add'), my_obj, follow=True)

        self.assertEqual(response.status_code, 200)

        self.assertEqual(MyModel.objects.count(), 1)
Run Code Online (Sandbox Code Playgroud)

但是,测试失败:

self.assertEqual(MyModel.objects.count(), 1)
AssertionError: 0 != 1
Run Code Online (Sandbox Code Playgroud)

Iva*_*van 0

我的回答晚了 5 年,但也许对其他人有帮助。

要访问 django 管理员用户需要拥有is_staff=True. 非员工用户被重定向到登录页面(这可能就是上面示例中发生的情况)。

此外,用户需要有足够的权限才能访问特定的管理页面(is_superuser=True如果不需要测试权限,则可以简单地解决此问题)。

因此,像这样的客户端设置可能会解决该问题:

user = User.objects.create_superuser(username='super', 
                                     email='super@email.org', 
                                     password='pass')
client.login(username=user.username, password='pass')
# now you can access django admin
Run Code Online (Sandbox Code Playgroud)

response.context_data如果出现问题,您可以检查以获取更多信息。

save_model但我认为还有一种更干净的测试方法,请参阅此答案