使用模拟补丁来模拟实例方法

时间:2011-12-12 03:36:15

标签: python mocking

我正在尝试使用富有想象力的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))

我做错了什么?

2 个答案:

答案 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))