如何模拟模块而不是其中的所有方法?
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(...)
我是模拟新手。我查看了 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(...)