Próbuję coś wyszydzić podczas testowania aplikacji Django przy użyciu pomysłowo nazwanej biblioteki testowej Mock . Nie wydaje mi się, żeby to działało, próbuję to zrobić:
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))
Co ja robię źle?
bar
jest w rzeczywistości „metodą instancji”, a jej jedynym parametrem jestself
. Aby być metodą klasową, musiałaby być sparametryzowanacls
i można ją wywołać jakoPromotion.foo()
.@patch.object('my_app.models.FooClass', 'bar')
cls
, ale co ważniejsze (ponieważself
icls
nie oznacza nic specjalnego w Pythonie), ozdobiony@classmethod
Odpowiedzi:
Aby dodać do odpowiedzi Kita, określenie trzeciego argumentu
patch.object()
pozwala określić mockowany obiekt / metodę. W przeciwnym razieMagicMock
używany jest obiekt domyślny .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!
Zauważ, że jeśli podasz obiekt szyderczy, a następnie domyślny
MagicMock()
jest już przeszedł do poprawionych obiektu - na przykład już nie:def test_enter_promotion(self, mock_method):
lecz:
def test_enter_promotion(self):
http://www.voidspace.org.uk/python/mock/patch.html#patch-object
źródło
Ach, nie wiedziałem, gdzie zastosować ten dekorator. Naprawiony:
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))
źródło
mock_method
przekazany do funkcji testowej. Udało mi się zastosować tę technikę w jednym z moich testów. Jest to przydatne tylko wtedy, gdy chcesz sprawdzić, czy została wywołana fałszywa metoda.