在django中测试自定义管理操作

问题描述 投票:17回答:3

我是django的新手,我在测试app_model_changelist下拉列表中的自定义操作(例如actions = ['mark_as_read'])时遇到问题,它与标准的“删除选中”相同。自定义操作在管理视图中工作,但我不知道如何在我的模拟请求中调用它,我知道我需要发布数据但是如何说我想对我发布的数据执行“mark_as_read”操作?

我想反转changelist url并发布查询集,以便“mark_as_read”动作函数处理我发布的数据。

change_url = urlresolvers.reverse('admin:app_model_changelist')
response = client.post(change_url, <QuerySet>)
django testing request action admin
3个回答
25
投票

只需使用操作名称传递参数action即可。

response = client.post(change_url, {'action': 'mark_as_read', ...})

选中的项目作为_selected_action参数传递。所以代码将是这样的:

fixtures = [MyModel.objects.create(read=False),
            MyModel.objects.create(read=True)]
should_be_untouched = MyModel.objects.create(read=False)

#note the unicode() call below
data = {'action': 'mark_as_read',
        '_selected_action': [unicode(f.pk) for f in fixtures]}
response = client.post(change_url, data)

4
投票

这就是我做的:

data = {'action': 'mark_as_read', '_selected_action': Node.objects.filter(...).values_list('pk', flat=True)}
response = self.client.post(reverse(change_url), data, follow=True)
self.assertContains(response, "blah blah...")
self.assertEqual(Node.objects.filter(field_to_check=..., pk__in=data['_selected_action']).count(), 0)

关于这一点的几点说明,与接受的答案相比:

  • 我们可以使用values_list而不是list comprehension来获取id。
  • 我们需要指定qazxsw poop,因为预计成功的帖子会导致重定向
  • (可选)声明成功的消息
  • 检查更改是否确实反映在db上。

2
投票

以下是您使用登录和所有内容进行操作的方法,一个完整的测试用例:

follow=True

只需修改即可使用您的模型和自定义操作并运行测试。

更新:如果你得到302,你可能需要在from django.test import TestCase from django.urls import reverse from content_app.models import Content class ContentModelAdminTests(TestCase): def setUp(self): # Create some object to perform the action on self.content = Content.objects.create(titles='{"main": "test tile", "seo": "test seo"}') # Create auth user for views using api request factory self.username = 'content_tester' self.password = 'goldenstandard' self.user = User.objects.create_superuser(self.username, '[email protected]', self.password) def shortDescription(self): return None def test_actions1(self): """ Testing export_as_json action App is content_app, model is content modify as per your app/model """ data = {'action': 'export_as_json', '_selected_action': [self.content._id, ]} change_url = reverse('admin:content_app_content_changelist') self.client.login(username=self.username, password=self.password) response = self.client.post(change_url, data) self.client.logout() self.assertEqual(response.status_code, 200) 中使用follow=True

© www.soinside.com 2019 - 2024. All rights reserved.