Faire des tests sur des CBV

@method_decorator(login_required)

Le problème exposé dans ce sujet a été résolu.

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)
+0 -0

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?

+0 -0

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)
+0 -0

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
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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