测试Django管理操作(重定向/授权问题)
问题描述:
我试图在change_list
视图中为管理员操作编写测试。我提到this question,但无法让测试正常工作。这里是我的代码和问题:测试Django管理操作(重定向/授权问题)
class StatusChangeTestCase(TestCase):
"""
Test case for batch changing 'status' to 'Show' or 'Hide'
"""
def setUp(self):
self.categories = factories.CategoryFactory.create_batch(5)
def test_status_hide(self):
"""
Test changing all Category instances to 'Hide'
"""
# Set Queryset to be hidden
to_be_hidden = models.Category.objects.values_list('pk', flat=True)
# Set POST data to be passed to changelist url
data = {
'action': 'change_to_hide',
'_selected_action': to_be_hidden
}
# Set change_url
change_url = self.reverse('admin:product_category_changelist')
# POST data to change_url
response = self.post(change_url, data, follow=True)
self.assertEqual(
models.Category.objects.filter(status='show').count(), 0
)
def tearDown(self):
models.Category.objects.all().delete()
我试着用print
,看看有什么反应是,这是我得到了什么:
<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/admin/login/?next=/admin/product/category/">
看起来这需要我的登录凭据 - 我试图创建一个用户在setUp()
并按照Django文档登录测试,但它似乎没有工作。
任何帮助,将不胜感激!
答
我找到了解决方案 - 当我创建超级用户时,我没有实例化Django的Client()
类,所以无论何时登录 - 它都不会在我的后续请求中持续存在。正确的代码应该像这样。
def test_status_hide(self):
"""
Test changing all Category instances to 'Hide'
"""
# Create user
user = User.objects.create_superuser(
username='new_user', email='[email protected].com', password='password',
)
# Log in
self.client = Client()
self.client.login(username='new_user', password='password')
# Set Queryset to be hidden
to_be_hidden = models.Category.objects.values_list('pk', flat=True)
# Set POST data to be passed to changelist url
data = {
'action': 'change_to_hide',
'_selected_action': to_be_hidden
}
# Set change_url
change_url = self.reverse('admin:product_category_changelist')
# POST data to change_url
response = self.client.post(change_url, data, follow=True)
self.assertEqual(
models.Category.objects.filter(status='show').count(), 0
)
+0
如果您使用Django的测试用例类('from django.test import TestCase'),那么您可以使用'self.client'而不用自己实例化它。 – Alasdair
是的,您需要创建一个用户然后登录测试客户端。请显示你的尝试和发生了什么。 – Alasdair
@阿拉斯代尔谢谢!我重新尝试了它(在进入睡眠状态之后),并意识到我没有实例化django的'Client'类,因此登录并没有在我的后续请求中持续存在。感谢您指点我的方向:) –