2017-02-10 35 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