如何模拟模块而不是其中的所有方法?

How to mock a module but not all the methods in it?

我是模拟新手。我查看了 mock 模块并了解如何使用补丁装饰器模拟特定方法或模块。

为了模拟模块中的单个方法,一种方法是:

@mock.patch('module1.method1')
def test_val(self, mock_method1):
    mock_method1.return_value = "whatever_i_want"

为了在同一个模块中模拟多个方法,我可以这样做:

@mock.patch('module1.method2')
@mock.patch('module1.method1')
def test_val(self, mock_method1, mock_method2):
    mock_method1.return_value = "whatever_i_want"
    mock_method1.return_value = "whatever"

我想要的是模拟一个模块中的几个方法,其他的保持原样。如果我模拟整个模块,那么该模块中的每个方法或属性都会被模拟。

所以,不是像我上面展示的那样单独模拟多个方法,有什么方法可以模拟整个模块(只保留某些方法未模拟)?

您可以子class 测试class 并模拟构造函数中的所有方法。然后在测试下你只使用模拟 class 而不是真正的

class MockSubClass(RealClass):

    def __init__(self, *args, **kwargs):
        self.method_to_mock1 = mock.create_autospec(RealClass, 'method_to_mock1', ...)
        ...

class TestRealClass(TestCase):

    def setUp(self, *args, **kwargs):
        self.object_to_test = MockSubClass(...)