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

问题描述 投票:0回答:3

我在使用富有想象力的名称“模拟测试库”测试 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))

我做错了什么?

python mocking
3个回答
101
投票
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()

不再
传递到修补的对象中——例如不再: def test_enter_promotion(self, mock_method):

而是:

def test_enter_promotion(self):

https://docs.python.org/3/library/unittest.mock.html#patch-object


45
投票

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



7
投票

assert_called

等操作,请使用
patch.object
并将替换方法包装在
MagicMock(side_effect=)
中,即:
with patch.object(class_to_mock, attribute_name, \
 MagicMock(side_effect=replacement_method)) as replacement_method_mock:

例如:

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()

© www.soinside.com 2019 - 2024. All rights reserved.