2017-09-01 2 views
0

Das Problem dank Thaian gelöst wurde, durch eine Anmeldung zu Beginn der ‚test_create‘ Funktion hinzufügen, wie Sie auf dieser Seite angemeldet werden müssen, um die CreateDjango Test-Client-post-Daten

verwenden

Ich schreibe gerade einen Test für eine createview und kann keine Daten darauf veröffentlichen.

Das Objekt getestet wird, hat das folgende Modell

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

und wird in der folgenden (generic) Ansicht

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

Und dies ist der Test verwendet, die ich verwende.

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) 

Die Behauptung, die den Fehler wirft, ist die 'Get' Anfrage am Ende.

Also das Objekt ist nicht erstellt, aber der Test überprüft die 302 Ansicht, was bedeutet, dass ein Beitrag erstellt wird. Ich verstehe nicht, warum dieser Test nicht das tut, was er sollte. Könnte mir hier jemand helfen?

=====

Nach Thaians Anregungen erhielt ich folgende Werte:

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

Antwort

2

Sie Antwort drucken Haben und überprüfen, was vielleicht zurückkehren?

Eine gute Idee ist, Tests mit PDB auszuführen.

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) 

Importparameteraddierroutine pdb; pdb.set_trace() in der Prüfung und dann self.client.post (überprüfen).

Also bitte einfügen welche Antwort enthalten.

+0

Dank für Ihre Nachricht Danke, PDB folgende Variable Ausgänge haben: Antwort: Vary: Plätzchen Content-Length: 0 Content-Type: text/html; charset = utf-8 Ort:?/accounts/login/next =/my/Rolle/create/ Client: >< gebundene Methode Client.post von > – Jasper

+0

@Jasper fügen Sie in der ersten Zeile in test_create erzwingen Autorisierung zum Beispiel: 'self.client.force_login (self.user)' vielleicht lösen Sie Ihr Problem wenn nur authentifizierte Benutzer eine neue Rolle erstellen können. [django force_login] (https://docs.djangoproject.com/de/1.11/topics/testing/tools/#django.test.Client.force_login) – Thaian

+0

Das hat mein Problem gelöst! Ich habe völlig vergessen, ein Login für den Benutzer hinzuzufügen. (Ein Fehler, der noch dadurch verschlimmert wird, dass ich ihn bei allen anderen Funktionen hinzugefügt habe, doh) Vielen Dank für Ihre Hilfe! – Jasper

Verwandte Themen