2017-09-01 3 views
0

Le problème a été résolu grâce à Thaian, en ajoutant un login au début de la fonction « test_create », comme vous devez être connecté sur ce site pour utiliser le CreateViewdonnées post client test Django

Je suis en train d'écrire un test pour un createview et je suis incapable de publier des données.

L'objet mis à l'essai a le modèle suivant

class Role(models.Model): 
    name = models.CharField(max_length=255) 
    linked_tenant = models.ForeignKey(Tenant, blank=True, null=True) 

et est utilisé dans ce qui suit (générique) vue

class RolCreate(TenantRootedMixin, CreateView): 
    model = RolTemplate 
    form_class = RoleForm 

    def get_form_kwargs(self): 
     kwargs = super(RolCreate, self).get_form_kwargs() 
     kwargs['linked_tenant'] = self.request.tenant 
     return kwargs 

    def form_valid(self, form): 
     form.instance.linked_tenant = self.kwargs.get('tenant') 
     return super(RolCreate, self).form_valid(form) 

    def get_success_url(self, **kwargs): 
     return reverse('rol_list', args=[self.request.tenant.slug]) 

Et c'est le test que j'utilise.

class RolCreate_tests(TestCase): 

    def setUp(self): 
     self.tenant = get_tenant() 
     self.role = get_role(self.tenant) 
     self.client = Client(HTTP_HOST='tc.tc:8000') 
     self.user = get_user(self.tenant) 

    def test_create(self): 

     response = self.client.post(reverse('rolcreate'), {'name' : 'new_object'}) 
     self.assertEqual(response.status_code, 302) 
     test_against = Role.objects.get(name='new_object') 
     self.assertEqual(test_against, self.tenant) 

L'assertion qui lance l'erreur est la requête 'get' à la fin.

DoesNotExist: Role matching query does not exist. 

Ainsi, l'objet n'est pas créé, mais le test ne valide la vue 302, ce qui signifie un poste est fait. Je ne comprends pas pourquoi ce test ne fait pas ce qu'il devrait faire. Quelqu'un pourrait-il m'aider?

=====

Après Thaians suggestions que j'ai obtenu les valeurs suivantes:

(Pdb) print(self.client.post) 
<bound method Client.post of <django.test.client.Client object at  0x10f20da50>> 

Pdb) response 
<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/accounts/login/?next=/my/role/create/"> 
(Pdb) print(response) 
Vary: Cookie 
Content-Length: 0 
Content-Type: text/html; charset=utf-8 
Location: /accounts/login/?next=/my/role/create/ 

Répondre

2

Avez-vous imprimé réponse et vérifier ce retour peut-être?

Bonne idée est d'exécuter des tests avec PDB.

def test_create(self): 

     response = self.client.post(reverse('rolcreate'), {'name' : 'new_object'}) 
     import pdb; pdb.set_trace() 
     self.assertEqual(response.status_code, 302) 
     test_against = Role.objects.get(name='new_object') 
     self.assertEqual(test_against, self.tenant) 

add import pdb; pdb.set_trace() dans votre test, puis vérifier self.client.post().

Alors s'il vous plaît coller ce que la réponse contient.

+0

Nous vous remercions pour votre message, pdb a donné les sorties variables suivantes: réponse: Variez: Cookie Content-Length: 0 Content-Type: text/html; charset = utf-8 Lieu:/comptes/login/next =/mon/rôle/créer/ client: >< méthode liée Client.post de > – Jasper

+0

@Jasper ajouter en première ligne dans test_create autorisation de la force par exemple: 'self.client.force_login (self.user)' peut-être résoudre ce problème votre problème si seuls les utilisateurs authentifiés peuvent créer un nouveau rôle. [django force_login] (https://docs.djangoproject.com/fr/1.11/topics/testing/tools/#django.test.Client.force_login) – Thaian

+0

Cela a résolu mon problème! J'ai complètement oublié d'ajouter un identifiant pour l'utilisateur. (Une erreur rendue encore pire par le fait que je l'ai ajouté sur toutes les autres fonctions, doh) Un grand merci pour votre aide! – Jasper