Ich versuche, etwas zu verspotten, während ich eine Django-App mit der fantasievollen Mock-Testbibliothek teste . Ich kann es nicht ganz zum Laufen bringen, ich versuche das zu tun:
models.py
from somelib import FooClass
class Promotion(models.Model):
foo = models.ForeignKey(FooClass)
def bar(self):
print "Do something I don't want!"
test.py
class ViewsDoSomething(TestCase):
view = 'my_app.views.do_something'
def test_enter_promotion(self):
@patch.object(my_app.models.FooClass, 'bar')
def fake_bar(self, mock_my_method):
print "Do something I want!"
return True
self.client.get(reverse(view))
Was mache ich falsch?
bar
ist in der Tat eine "Instanzmethode" und ihr einziger Parameter istself
. Um eine Klassenmethode zu sein, müsste sie mit parametriertcls
werden und kann als aufgerufen werdenPromotion.foo()
.@patch.object('my_app.models.FooClass', 'bar')
cls
, aber was noch wichtiger ist (daself
undcls
nichts Besonderes in Python bedeuten), dekoriert mit@classmethod
Antworten:
Um die Antwort von Kit zu ergänzen, geben Sie ein drittes Argument an, damit
patch.object()
das verspottete Objekt / die verspottete Methode angegeben werden kann. Andernfalls wird ein StandardobjektMagicMock
verwendet.def fake_bar(self): print "Do something I want!" return True @patch.object(my_app.models.FooClass, 'bar', fake_bar) def test_enter_promotion(self): self.client.get(reverse(view)) # Do something I want!
Beachten Sie, dass, wenn Sie das spöttische Objekt angeben, wird der Standard
MagicMock()
ist nicht mehr in das gepatchte Objekt übergeben - zum Beispiel nicht mehr:def test_enter_promotion(self, mock_method):
aber stattdessen:
def test_enter_promotion(self):
http://www.voidspace.org.uk/python/mock/patch.html#patch-object
quelle
Ah, ich war verwirrt, wo ich diesen Patch-Dekorateur anwenden sollte. Fest:
class ViewsDoSomething(TestCase): view = 'my_app.views.do_something' @patch.object(my_app.models.FooClass, 'bar') def test_enter_promotion(self, mock_method): self.client.get(reverse(view))
quelle
mock_method
an die Testfunktion übergebene Argument hergestellt . Ich konnte diese Technik in einem meiner Tests anwenden. Dies ist nützlich, wenn Sie nur überprüfen möchten, ob die verspottete Methode aufgerufen wurde.