How to pass, Django mock-Instanz die Methode der Klasse?
Mock-Bibliothek zum testen ist das eine Django-Thema, ich kann einfach nicht scheinen zu wickeln meinem Kopf herum. Zum Beispiel in dem folgenden code, warum nicht die mock-User-Instanzen, erstelle ich in meinem unit-test erscheint in der User-Objekt, das ich Abfrage in der "get_user_ids' - Methode? Wenn ich halt den test in der 'get_user_ids' Methode, die über die debug-Aufruf und die "User.Objekte.alle()", es gibt nichts in der Benutzer-queryset und der test schlägt fehl. Bin ich nicht die Schaffung von drei mock-User-Instanzen, wird abgefragt, die die UserProxy-statische Methode?
Bin ich mit Django 1.6 und Postgres 9.3 und läuft der test mit dem Befehl "python manage.py test -s-apps.Profil.tests.model_tests:TestUserProxy".
Dank!
# apps/profile/models.py
from django.contrib.auth.models import User
class UserProxy(User):
class Meta:
proxy = True
@staticmethod
def get_user_ids(usernames):
debug()
user_ids = []
for name in usernames:
try:
u = User.objects.get(username__exact=name)
user_ids.append(u.id)
except ObjectDoesNotExist:
logger.error("We were unable to find '%s' in a list of usernames." % name)
return user_ids
# apps/profile/tests/model_tests.py
from django.test import TestCase
from django.contrib.auth.models import User
from mock import Mock
from apps.profile.models import UserProxy
class TestUserProxy(TestCase):
def test_get_user_ids(self):
u1 = Mock(spec=User)
u1.id = 1
u1.username = 'user1'
u2 = Mock(spec=User)
u2.id = 2
u2.username = 'user2'
u3 = Mock(spec=User)
u3.id = 3
u3.username = 'user3'
usernames = [u1.username, u2.username, u3.username]
expected = [u1.id, u2.id, u3.id]
actual = UserProxy.get_user_ids(usernames)
self.assertEqual(expected, actual)
- Ich Las deine Frage noch einmal und Ihre Kommentare zu dem anderen Beitrag. Sie wollen eine echte user und nicht verhöhnt: Sie brauchen, um das Reale Objekt durch
User()
wie in docs.djangoproject.com/en/1.7/intro/tutorial05/... .Mock()
werden verspottet und nicht wrapers. Sollten Sie Ihre Frage klar zu sein... Zwei so missverstanden haben, was Sie wollen...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Spott ist genial zum testen, und kann führen sehr sauber-tests, aber es leidet ein wenig aus (ein) ein bisschen fummelig zu bekommen, den Kopf um, wenn Sie anfangen, und (b) erfordert einige Anstrengung oft zum set-up, mock-Objekte und haben dann eingeführt/verwendet werden, an den richtigen stellen.
Den mock-Objekte, die Sie erstellen, für die Nutzer sind Objekte, die Aussehen wie eine Django
User
Modell-Objekt, aber Sie sind nicht die tatsächlichen model-Objekte, und kommen so nicht in die Datenbank.Um Ihren test zu arbeiten, haben Sie zwei Möglichkeiten, je nachdem, welche Art von test, den Sie schreiben wollen.
Unit-Test - Dummy die Daten aus der Datenbank zurückgegeben
Die erste option ist es, eine Arbeit als unit-test, d.h. eine Prüfung der
get_user_ids
Methode isoliert von den Datenbank-layer. Um dies zu tun, würden Sie brauchen, zu verspotten, den Anruf zuUser.objects.get(username__exact=name)
so, es gibt die drei mock-Objekte, die Sie erstellt in Ihrem test. Dies wäre der richtige Ansatz (da ist es besser, ein test-Gerät der code in der isolation), aber es würde bedeuten, mehr Arbeit einzurichten, als die alternative unten.Einen Weg, dies zu erreichen, wäre zunächst eine Trennung der Benutzer-lookup in seine eigene Funktion in apps/profile/models.py:
Dieser muss aufgerufen werden, in Ihrer Funktion, durch den Austausch der Aufruf
Users.objects.get(username__exact=name)
mitget_users_by_name(name)
. Sie können dann ändern Sie Ihre test-patch die Funktion so auf:Integration-Test - Erstellen Sie Reale Benutzer-Objekte
Der zweite Ansatz ist, dies zu ändern, um eine integration Tests, d.h. tests, die sowohl in diesem als Einheit von code und auch die Interaktion mit der Datenbank. Dies ist etwas weniger sauber, dass Sie jetzt eigene tests auf der Methode, um die chance zu scheitern, weil sich Probleme in einer anderen Einheit des Codes (d.h. die Django-code für die Interaktion mit der Datenbank). Aber das macht das setup der test viel einfacher, und pragmatisch werden können, der richtige Ansatz für Sie.
Um dies zu tun, entfernen Sie einfach die verhöhnt, die Sie erstellt haben, und erstellen Sie die eigentlichen Anwender in der Datenbank als Teil des Tests.