2016-03-29 8 views
0

Ich bin mit Abdeckung in der folgenden Art und Weise meine django app zu testen:Django Funktionen Definition in views.py nicht in Abdeckung angezeigt?

DJANGO_SETTINGS_MODULE=$(SETTINGS) coverage run manage.py test -v 2 
DJANGO_SETTINGS_MODULE=$(SETTINGS) coverage report 

In meinem Test Suite testet ich einige Ansichten:

class TestJSON(TestCase): 

    def setUp(self): 
     self.client.login(username='admin', password='passwordz') 

    def test_bookmarks_json(self): 
     translator = User.objects.create_user('normaluser', '[email protected]', 
               'secretz') 
     search = SearchBookmark(
      search="minutes") 
     search.save() 
     response = self.client.get('/bookmarks_json/') 
     ans = json.loads(response.content)[0] 
     self.assertEqual(...) 

So bin ich klar alles in dieser Ansicht definiert trifft für '/bookmarks_json/'. Nie weniger coverage report sagt, dass die Unterschriftszeile nicht getroffen wird, z.B .:

@login_required 
def bookmarks_as_json(request): 
    bookmarks = SearchBookmark.objects.all() 
    data = serializers.serialize("json", bookmarks) 
    return HttpResponse(data, content_type='application/json') 

Ich habe die Lösung von Ned Batchelder hier Django coverage test for URLs 0%, why? gesehen und ich vermute es einige, wie verwandt ist. Als Folge ich meine eigenen Testrunner schrieb:

import os 
import sys 
import django 
from django.conf import settings 
from django.test.utils import get_runner 

if __name__ == "__main__": 
    os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings.dev' 
    django.setup() 
    TestRunner = get_runner(settings) 
    test_runner = TestRunner(verbosity=2) 
    failures = test_runner.run_tests(["myapp.tests"]) 
    sys.exit(bool(failures)) 

Und

python testrunner.py # works, def in view.py is reported ! 

Allerdings würde Ich mag den normalen Befehl verwenden ./manage.py test so frage ich mich, ob es einen Weg gibt, dieses Problem zu beheben, ohne meinen eigenen Testläufer zu schreiben.

Antwort

0

Das eigentliche Problem mit Ihrem Test scheint zu sein, dass Sie sich nicht anmelden, bevor Sie die Ansicht testen. Da die Ansicht den login_required Dekorator verwendet, wird der Client umgeleitet. Die Ansicht wird nicht ausgeführt, sodass sie im Überdeckungsbericht als fehlend angezeigt wird.

Sie können sich mit self.client.login() vor Ihrem self.client.get() Anruf anmelden.

translator = User.objects.create_user('normaluser', '[email protected]', 
             'secretz') 
search = SearchBookmark(
    search="minutes") 
search.save() 
self.client.login(username='normaluser', password='secretz') 
response = self.client.get('/bookmarks_json/') 
ans = json.loads(response.content)[0] 
+0

Das ist nicht das Problem. Was Sie nicht sehen, ist, dass meine 'setUp' Methode die Anmeldung durchführt. Ich überprüfe auch, ob der gelieferte Inhalt in Ordnung ist. – Oz123

+0

OK, Sie haben Ihre setUp-Methode zunächst nicht angezeigt, sodass wir nicht sehen konnten, dass Sie sich angemeldet haben. Ich lösche diese Antwort jetzt. – Alasdair