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

@Alasdair 감사합니다! 나는 (잠을 자고) 다시 시도하고 장고의'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]', 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의 테스트 케이스 클래스 ('django.test import TestCase')를 사용하면 직접 인스턴스화하지 않고'self.client'를 사용할 수 있습니다. – Alasdair