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

Kit*_*nde 67 python mocking

我正在尝试使用富有想象力的Mock测试库测试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))
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

sto*_*138 54

要添加到Kit的答案,请指定第3个参数以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!
Run Code Online (Sandbox Code Playgroud)

需要注意的是,如果指定的嘲讽对象,则默认MagicMock()不再传递到修补对象-如不再:

def test_enter_promotion(self, mock_method):
Run Code Online (Sandbox Code Playgroud)

但反而:

def test_enter_promotion(self):
Run Code Online (Sandbox Code Playgroud)

http://www.voidspace.org.uk/python/mock/patch.html#patch-object


Kit*_*nde 31

啊我很困惑在哪里应用那个补丁装饰器.固定:

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))
Run Code Online (Sandbox Code Playgroud)

  • 你现在在哪里建立模拟方法和假实现之间的联系? (18认同)

Voy*_*Voy 7

如果您想assert_called对模拟方法执行等操作,请patch.object在 a 中使用 和 包装替换方法MagicMock(side_effect=),即:

with patch.object(class_to_mock, attribute_name, \
 MagicMock(side_effect=replacement_method)) as replacement_method_mock:
Run Code Online (Sandbox Code Playgroud)

例如。:

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()
Run Code Online (Sandbox Code Playgroud)