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

时间:2017-01-11 10:51:59

标签: python unit-testing mocking python-unittest python-mock

我试图测试一个python类。我想模仿一些类的方法,但不是全部。使用mock.patch可以很好地实现这一点。我的问题是:

  1. 要修补许多功能,这意味着许多嵌套调用补丁。
  2. 有许多测试,并且由于补丁的范围性质,这意味着我需要在每个测试上进行补丁(这个类有许多测试需要相同的补丁)。
  3. 这有什么清洁的解决方案吗?

    为了提供更多颜色,这里有一个例子:

    # 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很长一段时间,但从来没有深入研究过嘲笑。

1 个答案:

答案 0 :(得分:0)

可能有助于你的一件事就是在设置方法中删除了课程。

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