Faire des tests sur des CBV

@method_decorator(login_required)

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je n'arrive pas a faire un test sur une CBV. je pense que cela vient de @method_decorator(login_required) puisque sans tout marche très bien.

Cependant je ne trouve nul part comment passer outre et j'ai ce décorateur sur environ 90% de mes vues…

Si un connaisseur pouvait m'aider ;)

Ma class de view

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class CompanyIndex(generic.ListView):
    template_name = 'company/index.html'
    context_object_name = 'company'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(CompanyIndex, self).dispatch(*args, **kwargs)

    def get_queryset(self):
        return Company.objects.all()

Ma class de test

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class CompanyTests(TestCase):

    def setUp(self):
        settings.EMAIL_BACKEND = \
            'django.core.mail.backends.locmem.EmailBackend'
        self.founder = FounderFactory()

    def test_index(self):
        # we need to be connected
        self.client.logout()
        self.client.login(username=self.founder.user.username, password="Toto1234!#")

        # list of members.
        result = self.client.get(
            reverse('company:index'),
            follow=False
        )
        self.assertEqual(result.status_code, 200)

J’adorerais changer le monde, mais ils ne veulent pas me fournir le code source…

+0 -0
Auteur du sujet

Oh excuse moi

AssertionError: 302 != 200

Il me fait donc une redirection au lieu de m'afficher la page. J'ai donc l'impression de ne pas être connecté

J’adorerais changer le monde, mais ils ne veulent pas me fournir le code source…

+0 -0
Auteur du sujet

C'est celui par défaut.

Je viens de voir que le ZDS ne fait pas de test sur les CBV ayant ce décorateur (ex:UpdateMember).

Du coup peut être est-ce simplement un problème a contourner? Mais alors comment?

J’adorerais changer le monde, mais ils ne veulent pas me fournir le code source…

+0 -0
Auteur du sujet

Oh-oh… J'ai bel et bien un problème de connexion…

Je viens de faire un : print self.founder.user.username qui a bien fonctionné en me renvoyant User1

PS: un print du password me le renvoie en clair par contre… Normal?

Voici mon code :

profil and user factory

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class UserFactory(factory.DjangoModelFactory):
    class Meta:
        model = User

    username = factory.Sequence('User{0}'.format)
    password = "Toto1234!#"
    is_active = True

class UserProfileFactory(factory.DjangoModelFactory):
    class Meta:
        model = UserProfile

    user = factory.SubFactory(UserFactory)

founder factory

1
2
3
4
5
class FounderFactory(factory.DjangoModelFactory):
    class Meta:
        model = Founder

    user = factory.SubFactory(UserFactory)

Édité par Sanoc

J’adorerais changer le monde, mais ils ne veulent pas me fournir le code source…

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

PS: un print du password me le renvoie en clair par contre… Normal?

Sanoc

Si j'en crois ton code, c'est normal. Lors de la définition de ton Factory User tu ne lui demande pas de hasher ton mot de passe. Tu devrais modifier ta classe UserFactory dans ce sens.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class UserFactory(factory.DjangoModelFactory):
    class Meta:
        model = User

    username = factory.Sequence('User{0}'.format)
    password = "Toto1234!#"
    is_active = True

    @classmethod
    def _prepare(cls, create, **kwargs): # surcharge de la méthode qui est exécutée avant la création du Factory
        pwd = kwargs.pop('password', None) # on récupère le mot de passe ci-dessus en clair "Toto1234!#"
        my_user = super(UserFactory, cls)._prepare(create, **kwargs)
        if pwd: # si le mot de passe a été donné comme c'est le cas ici
            my_user.set_password(password) # on chiffre le mot de passe
            if create:
                my_user.save() # on enregitre le nouvel Factory
        return my_user
Auteur du sujet

Effectivement ce n'est pas inutile… Je pensais que Django s'en occuper lui même.

Merci encore firm1! Décidement tu m'arrange pas mal!

J’adorerais changer le monde, mais ils ne veulent pas me fournir le code source…

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte