Ich habe Django-Code, der mit Anforderungsobjekten oder Benutzerobjekten interagiert. Zum Beispiel so etwas wie:
foo_model_instance = models.get_or_create_foo_from_user(request.user)
Wenn Sie mit der Django-Python-Shell oder in einem Unittest testen würden, was würden Sie dort weitergeben? Hier reicht einfach ein Benutzerobjekt aus, aber die Notwendigkeit eines Scheinanforderungsobjekts tritt auch häufig auf.
Für die Muschel oder für Unittests:
- Wie verspotten Sie Benutzer?
- Wie verspotten Sie Anfragen?
python
django
unit-testing
mocking
Purrell
quelle
quelle
Antworten:
Für eine Anfrage würde ich RequestFactory verwenden, das in Django enthalten ist.
from django.test.client import RequestFactory rf = RequestFactory() get_request = rf.get('/hello/') post_request = rf.post('/submit/', {'foo': 'bar'})
Für Benutzer würde ich django.contrib.auth.models.User verwenden, wie von @ozan vorgeschlagen, und möglicherweise mit Factory Boy für Geschwindigkeit (mit Factory Boy können Sie wählen, nicht in DB zu speichern)
quelle
request.user
jedoch eingestellt werden. Auch um diese Anfrage wie eine normale Ansicht zu verwenden, ist es schön, sierequest.csrf_processing_done = True
in der fertigen Anfrage zu haben (um die CSRF-Prüfungen zu bestehen)Initialisieren Sie ein
django.contrib.auth.models.User
Objekt.User.objects.create_user
macht das einfach.Initialisieren Sie ein
django.http.HttpRequest
Objekt.Natürlich gibt es Verknüpfungen, je nachdem, was Sie tun möchten. Wenn Sie nur ein Objekt mit einem
user
Attribut benötigen , das auf einen Benutzer verweist, erstellen Sie einfach etwas (irgendetwas) und geben Sie ihm dieses Attribut.quelle
User
Teil dieser Frage gilt). Wenn Sie nicht glauben, dass Mocks schneller sind als der tatsächliche Zugriff auf die Datenbank, dann haben Sie vermutlich nicht wirklich versucht und verglichen. Bei einem sehr kleinen Projekt wechselte unser Team von der Testsuite, die 1,5 Minuten bis <5 Sekunden dauerte, als wir den Code änderten, um Modelle zu verspotten. Es ist nicht nötig, einen Benchmark zu schreiben, wenn die Lücke so groß ist..user
Attribut. Instanzen vondjango.http.HttpRequest
nicht. Ich setze gerade request.user, nachdem ich es erstellt habe. Scheint das vernünftig?Sie können entweder Ihre eigenen Mocks würfeln, wie Anurag Uniyal vorgeschlagen hat, oder Sie können ein spöttisches Framework verwenden.
Als Antwort auf die Aussage, dass Sie einen normalen Benutzer wie in Django erstellen können, würde ich vorschlagen, dass dies den Punkt des Komponententests zunichte macht. Ein Komponententest sollte die Datenbank nicht berühren, aber durch das Erstellen eines Benutzers haben Sie die Datenbank geändert, weshalb wir eine verspotten möchten.
quelle
Lesen Sie hier über Scheinobjekte
http://en.wikipedia.org/wiki/Mock_object
http://www.mockobjects.com/
Und verwenden Sie diese Python-Bibliothek, um einen Benutzer zu verspotten
http://python-mock.sourceforge.net/
Andernfalls können Sie selbst eine einfache Benutzerklasse schreiben. Verwenden Sie diese als Ausgangspunkt
class MockUser(object): def __call__(self, *args, **kwargs): return self def __getattr__(Self, name): return self
Fügen Sie spezielle Fälle usw. usw. hinzu
quelle
Sie müssen Benutzer nicht verspotten, da Sie nur einen in Ihrem Test erstellen können - die Datenbank wird nach Abschluss des Tests zerstört.
Verwenden Sie dieses Snippet von Simon Willison, um Anfragen zu verspotten .
quelle