我正在尝试使用富有想象力的Mock testing library测试Django应用程序时模拟某些东西。我似乎无法完全开始工作,我正在尝试这样做:
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))
我做错了什么?
答案 0 :(得分:47)
要添加到Kit的答案,指定patch.object()
的第3个参数允许指定模拟的对象/方法。否则,使用默认的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
答案 1 :(得分:26)
啊我对应用该修补程序装饰器的位置感到困惑。修正:
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))