2017-02-10 39 views
2

我试图在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文档登录测试,但它似乎没有工作。

任何帮助,将不胜感激!

+0

是的,您需要创建一个用户然后登录测试客户端。请显示你的尝试和发生了什么。 – Alasdair

+0

@阿拉斯代尔谢谢!我重新尝试了它(在进入睡眠状态之后),并意识到我没有实例化django的'Client'类,因此登录并没有在我的后续请求中持续存在。感谢您指点我的方向:) –

回答

0

我找到了解决方案 - 当我创建超级用户时,我没有实例化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