Я пытаюсь издеваться над чем-то при тестировании приложения Django, используя творчески названную библиотеку тестирования Mock . Кажется, я не могу заставить его работать, я пытаюсь сделать это:
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))
Что я делаю неправильно?
bar
фактически является "методом экземпляра", и его единственный параметр -self
. Чтобы быть методом класса, он должен быть параметризован с помощьюcls
и вызывается какPromotion.foo()
.@patch.object('my_app.models.FooClass', 'bar')
cls
, но, что более важно (посколькуself
иcls
не означает ничего особенного в python), украшенный@classmethod
Ответы:
Чтобы добавить в ответ Kit, укажите третий аргумент,
patch.object()
позволяющий указать фиктивный объект / метод. В противном случае используетсяMagicMock
объект по умолчанию .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!
Обратите внимание , что, если вы укажете издевательский объект, то по умолчанию
MagicMock()
будет больше не передается в исправленной объект - например , больше не:def test_enter_promotion(self, mock_method):
но вместо того, чтобы:
def test_enter_promotion(self):
http://www.voidspace.org.uk/python/mock/patch.html#patch-object
источник
Ах, я был сбит с толку, где применить этот декоратор патча. Исправлена:
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))
источник
mock_method
переданным тестовой функции. Мне удалось использовать эту технику в одном из своих тестов. Это полезно, когда вы хотите только проверить, был ли вызван фиктивный метод.