2016-04-20 6 views
0

Ich habe einen seltsamen Fehler beim Schreiben eines APITestCase für eine Django-REST-Ansicht.Django REST-Test ignoriert Factory-URL

Dies ist mein Code:

class CreateUserTest(APITestCase): 
    def setup(self): 
     self.superuser = User.objects.create_superuser('[email protected]', '1989-10-06', 'vishnupassword') 
     self.client.login(username='vishnu', password='vishnupassword') 
     self.data = a bunch of trivial data 

    def test_can_create_user(self): 
     print "create user" 
     self.setup() 
     self.token = Token.objects.get(user_id=self.superuser.id) 
     self.api_key = settings.API_KEY 
     self.factory = APIRequestFactory() 
     self.request = self.factory.post('/api/v1/uaaaaaasers/?api_key=%s' % self.api_key, 
            self.data, 
            HTTP_AUTHORIZATION='Token {}'.format(self.token)) 
     force_authenticate(self.request, user=self.superuser) 
     self.view = UserList.as_view() 
     self.response = self.view(self.request) 
     self.response.render() 
     #print self.response.content 
     self.assertEqual(self.response.status_code, status.HTTP_201_CREATED) 

Wie Sie sehe ich factory.post auf eine absichtlich falsche URL run/api/v1/uaaaaaasers/

Aber der Test tut beschweren:

Creating test database for alias 'default'... 
create user . 
---------------------------------------------------------------------- 

Ran 1 test in 0.199s 

OK Destroying test database for alias 'default'... 

Sollte es nicht mit dieser falschen URL abstürzen? Woher weiß ich, dass der Test gut läuft?

Antwort

1

Sie alles falsch testen ... die Antwort, die Sie getestet haben, ist aus dem direkten Blick Anruf ...

self.view = UserList.as_view() 
self.response = self.view(self.request) 
self.response.render() 
    #print self.response.content 
self.assertEqual(self.response.status_code, status.HTTP_201_CREATED) 

Ihre obigen Fall wird der Blick immer anrufen ...

In der tatsächlichen Testfälle schlagen wir die URLs mit dem Kunden und testen diese Antwort

self.response = self.client.post('/api/v1/uaaaaaasers/?api_key=%s' % self.api_key, 
           self.data, 
           HTTP_AUTHORIZATION='Token {}'.format(self.token)) 
self.assertEqual(self.response.status_code, status.HTTP_201_CREATED) 
+0

Wo bekommen Sie in Ihrem Beispiel die self.response? – lapinkoira

+0

@lapinkoira aktualisiert oben:) ... das Problem in Ihrem obigen Code ist nur, dass Django die URL nicht auf die Ansicht zuordnet ... Sie rufen die Ansicht manuell aufrufen :) –

1

Wenn Sie das Senden einer Anfrage an eine ungültige URL testen möchten, verwenden Sie die test client anstelle der Anforderungsfactory.

class CreateUserTest(APITestCase): 

    def test_can_create_user(self): 
     ... 
     response = self.client.post(
      '/api/v1/uaaaaaasers/?api_key=%s' % self.api_key, 
      self.data, 
      ... 
     ) 
     ... 
+0

mmm ich bin Confu sed hier, woher weiß ich, dass ich meine URLs in all meinen Tests nicht falsch geschrieben habe? kann ich nicht auf Anfrage Fabrik verlassen? oder wie sind die besten Praktiken zum Testen von API-Ansichten in Django-Ruhe? – lapinkoira

+1

Wenn Sie die Anfrage Factory verwenden, testen Sie die Ansicht. Sie testen nicht, dass Ihr URL-Muster mit der richtigen Ansicht konfiguriert ist. Mit dem Test-Client wird eine Anfrage an eine bestimmte URL simuliert, also * testet * Ihre URL-Konfiguration. Die Anforderungsfactory gibt Ihnen mehr Kontrolle, aber oft ist dies nicht notwendig, und es ist einfacher, den Testclient zu verwenden. – Alasdair