2013-07-24 16 views
5

Ich habe begonnen, einen benutzerdefinierten Kontextprozessor zu verwenden, um ein Objekt an jede Antwort zu übergeben. Das einzige Problem dabei ist, dass meine Tests jetzt fehlschlagen, weil sie dieses Objekt nicht in der Datenbank finden können. Ich habe versucht, einen Test mit Request Factory zu erstellen, da mein Verständnis war, dass dies Tests von Django wie Middleware usw. isoliert. Ich vermute, dass Kontext-Prozessoren immer noch ausgeführt werden. Gibt es einen Weg, um darüber hinweg zu kommen? Muss ich dieses Objekt bei jedem Test bestehen? Wenn es irgendeinen Weg gibt, es zu vermeiden, würde ich es lieber tun.Benutzerdefinierte Kontextprozessoren, UnitTests und Request Factory

Antwort

1

Nach weiterer Untersuchung, denke ich, ist die beste Lösung, das Context_Processors Tupel während jedes Tests zu überschreiben. Dies ist seit 1.4 möglich. Es scheint besser, als das erforderliche Objekt an jeden Test zu senden. Ich würde gerne untersuchen, ob ich dafür einen Dekorateur schreiben kann, aber ich weiß noch nicht genug über sie. Referenz: https://docs.djangoproject.com/en/dev/topics/testing/overview/#overriding-settings

edit: Eine weitere Implementierung dieser Lösung hier skizziert: How to Unit test with different settings in Django? wahrscheinlich besser, da es für eine ganze tests.py

edit2 getan werden kann: entdeckt zu haben, dass Dekorateure sind eigentlich Python-Konstrukte (vorausgesetzt sie waren benutzerdefinierte Django Funktionalität! massive Neuling zu Python, übrigens. lernte Django, bevor ich gelernt, Python), ich denke, eine benutzerdefinierte Dekorateur ist die Art, wie ich damit gehen werde.

edit3: Ich denke eigentlich eine einfachere Lösung wäre, eine test.py Datei in meinem Einstellungsmodul zu haben und mein Basiseinstellungen context_processor Modul mit dem der Testeinstellungen in den Tests zu überschreiben. Zum Beispiel:

from settings import localsettings 
from settings import testsetttings 

localtestsettings.context_processors = testsettings.context_processors 

tests(unittest):..... 

Alle anderen Vorschläge sind mehr als willkommen.

edit4: Okay. Ich fühle mich jetzt dumm. Offensichtlich besteht die Lösung, die ich verwendet habe, darin, eine Testeinstellungsdatei zu erstellen und diese an den Testbefehl zu übergeben.

1

verwenden auf tests.py arbeitete gut mit mir

from django.test import TestCase, Client, override_settings 

@override_settings (
    TEMPLATES = [ 
    { 
    'BACKEND': 'django.template.backends.django.DjangoTemplates', 
    'DIRS': [], 
    'APP_DIRS': True, 
    'OPTIONS': { 
     'context_processors': [ 
      'django.template.context_processors.debug', 
      'django.template.context_processors.request', 
      'django.contrib.auth.context_processors.auth', 
      'django.contrib.messages.context_processors.messages', 
     ], 
    }, 
    }, 
    ] 
) 

class HomeViewTestCase(TestCase): 
    ... 
Verwandte Themen