2017-02-10 2 views
2

J'essaie d'écrire des tests pour une action Admin dans la vue change_list. Je me suis référé à this question, mais je n'ai pas réussi à faire fonctionner le test. Voici mon code et numéro:Test de l'action Admin Django (redirection/auth)

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() 

J'ai essayé d'utiliser print pour voir ce que la réponse a été et ce que je suis:

<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/admin/login/?next=/admin/product/category/"> 

Il semble que ce besoin de mes identifiants de connexion - J'ai essayé de créer un utilisateur dans setUp() et connectez-vous selon les docs Django sur les tests, mais cela ne semble pas fonctionner.

Toute aide serait appréciée!

+0

Oui, vous devez créer un utilisateur, puis vous connecter au client de test. S'il vous plaît montrer ce que vous avez essayé et ce qui est arrivé. – Alasdair

+0

@Alasdair merci! Je l'ai de nouveau essayé (après avoir dormi) et j'ai réalisé que je n'instancais pas la classe 'Client' de django, donc la connexion ne persistait pas dans mes requêtes suivantes. Merci de m'avoir indiqué dans la bonne direction :) –

Répondre

0

J'ai trouvé la solution - je n'instancais pas la classe Client() de Django lorsque j'ai créé un super-utilisateur, donc à chaque connexion, elle ne persistait pas dans mes requêtes suivantes. Le code correct devrait ressembler à ceci.

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

Si vous utilisez la classe de cas de test de Django ('from django.test import TestCase') alors vous pouvez utiliser' self.client' sans l'instancier vous-même. – Alasdair