Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用pythonmock模拟类中的许多函数,但不是所有函数_Python_Unit Testing_Mocking_Python Unittest_Python Mock - Fatal编程技术网

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

使用pythonmock模拟类中的许多函数,但不是所有函数,python,unit-testing,mocking,python-unittest,python-mock,Python,Unit Testing,Mocking,Python Unittest,Python Mock,我正在测试一个python类。我想模拟一些类的方法,但不是全部。这可以通过mock.patch很好地实现。我的问题是: 有许多函数需要修补,因此这意味着要对修补进行许多嵌套调用 有很多测试,由于补丁的作用域性质,这意味着我需要在每个测试上进行补丁(这个类有很多测试需要相同的补丁) 有没有干净的解决办法 下面是一个例子,让我们看一看更多的颜色: # test_me.py class ClassUnderTest: # All foo functions should be mocked

我正在测试一个python类。我想模拟一些类的方法,但不是全部。这可以通过
mock.patch
很好地实现。我的问题是:

  • 有许多函数需要修补,因此这意味着要对修补进行许多嵌套调用
  • 有很多测试,由于补丁的作用域性质,这意味着我需要在每个测试上进行补丁(这个类有很多测试需要相同的补丁)
  • 有没有干净的解决办法

    下面是一个例子,让我们看一看更多的颜色:

    # 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很长时间了,但从未深入研究过模仿。

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

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

    另外,这是一个附录,更像是一个评论。令人恼火的是,由于模拟的作用域性质,无法在测试
    设置中进行模拟。