使用模拟修补程序来模拟实例方法

我试图嘲笑一些东西,而使用富有想象力的模拟testing库来testing一个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)) 

我究竟做错了什么?

要添加到Kit的答案,指定第三个参数patch.object()允许指定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()对象,则默认的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))