使用python m模拟类中的许多函数,但不是所有函数

2024-06-07 03:01:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在测试一个python类。我想嘲笑一些类的方法,但不是所有的方法。使用mock.patch可以很好地实现这一点。我的问题是:

  1. 有许多函数需要修补,所以这意味着要对patch进行许多嵌套调用。在
  2. 有很多测试,由于补丁的作用域性质,这意味着我需要对每个测试进行补丁(对于这个类有很多测试需要相同的补丁)。在

有什么干净的解决办法吗?在

为了提供更多的颜色,下面是一个例子:

# test_me.py
class ClassUnderTest:

    # All foo functions should be mocked
    def foo1(self):
        pass

    def foo2(self):
        pass

    def foo3(self):
        pass                

    # All bar functions should NOT be mocked
    def bar1(self):
        pass

    def bar2(self):
        pass

    def bar3(self):
        pass                        


# test.py

@mock.patch.object(test_me.ClassUnderTest, 'foo3', autospec=True)
@mock.patch.object(test_me.ClassUnderTest, 'foo2', autospec=True)
@mock.patch.object(test_me.ClassUnderTest, 'foo1', autospec=True)
class MyTestCase(unittest.TestCase):

    def setup_mocks(self, mock_foo1, mock_foo2, mock_foo3):
        # Do things like assign side_effect or return_value to each of the foo mocks
        pass

    def test_1(self, mock_foo1, mock_foo2, mock_foo3):
        self.setup_mocks(mock_foo1, mock_foo2, mock_foo3)
        # Do test_1 tests

    def test_2(self, mock_foo1, mock_foo2, mock_foo3):
        self.setup_mocks(mock_foo1, mock_foo2, mock_foo3)        
        # Do test_2 tests

我需要模仿的类和函数越多,这个解决方案就越不干净。有更好的解决办法吗?在

我已经准备好接受这样的回答:“你需要重构你的代码,使之更易于测试”。我习惯于从C/C++世界中设计测试到体系结构。然而,我希望从一个动态的语言更好。我已经使用python很长一段时间了,但从来没有深入研究过mocking。在


Tags: testselftrueobjectdefpassmockpatch
1条回答
网友
1楼 · 发布于 2024-06-07 03:01:35

有一件事可能会对您有所帮助,那就是在setup方法中去掉undertest类。在

class ClassUnderTestStub(ClassUnderTest):
  def __init__(self, *args, **kwargs):
    self.arbitrary_attr = None
    ...

def setUp(self):
  self.helper = self.ClassUnderTestStub()
  self.helper.arbitrary_function = mock.MagicMock(...)

def testFoo(self):
  self.helper.foo_dependency = mock.MagicMock(...)

相关问题 更多 >