[英]Using mock patch to mock an instance method
I'm trying to mock something while testing a Django app using the imaginatively named Mock testing library .我试图在使用富有想象力的名称Mock testing library测试 Django 应用程序时模拟某些东西。 I can't seem to quite get it to work, I'm trying to do this:
我似乎无法让它正常工作,我正在尝试这样做:
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))
What am I doing wrong?我究竟做错了什么?
To add onto Kit's answer, specifying a 3rd argument to patch.object()
allows the mocked object/method to be specified. 为了增加Kit的答案,在
patch.object()
指定第3个参数可以指定patch.object()
对象/方法。 Otherwise, a default MagicMock
object is used. 否则,将使用默认的
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!
Note that, if you specify the mocking object, then the default MagicMock()
is no longer passed into the patched object -- eg no longer: 请注意,如果指定了
MagicMock()
对象,则默认的MagicMock()
不再传递到修补的对象中-例如,不再:
def test_enter_promotion(self, mock_method):
but instead: 但反而:
def test_enter_promotion(self):
http://www.voidspace.org.uk/python/mock/patch.html#patch-object http://www.voidspace.org.uk/python/mock/patch.html#patch-object
Ah I was confused on where to apply that patch decorator. 啊,我对在哪里应用该补丁装饰程序感到困惑。 Fixed:
固定:
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))
If you'd like to do assert_called
etc. against the mocked method, use the patch.object
and wrap replacement method in a MagicMock(side_effect=)
, ie:如果您想对
assert_called
方法执行assert_called
等,请使用patch.object
并将替换方法包装在MagicMock(side_effect=)
,即:
with patch.object(class_to_mock, attribute_name, \
MagicMock(side_effect=replacement_method)) as replacement_method_mock:
eg.:例如。:
from unittest.mock import patch, MagicMock
def fake_bar(self):
print "Do something I want!"
return True
def test_enter_promotion(self):
with patch.object(my_app.models.FooClass, 'bar', MagicMock(side_effect=fake_bar)) as fake_bar_mock:
self.client.get(reverse(view))
# Do something I want!
fake_bar_mock.assert_called()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.