【问题标题】:How to mock a module but not all the methods in it?如何模拟一个模块而不是其中的所有方法?
【发布时间】:2017-08-28 07:56:12
【问题描述】:

我是嘲笑的新手。我查看了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"

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

那么,与其像上面展示的那样单独模拟多个方法,有什么方法可以模拟整个模块(只保持某些方法不被模拟)?

【问题讨论】:

  • 能否请您发布您正在测试的代码?您可以对其进行重构,以便测试可以使用测试自行配置的对象直接调用它,从而允许您覆盖单个方法或 w/e。您是否正在寻找模拟对象的黑名单方法??
  • @dm03514 很抱歉,我无法发布我的代码。不,我正在寻找一种白名单方法(模拟模块中的所有方法,除了少数需要的方法)

标签: python unit-testing mocking python-unittest


【解决方案1】:

您可以将被测类子类化并模拟出构造函数中的所有方法。然后在测试中你只使用模拟类而不是真实类。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2021-12-11
    • 2019-12-07
    相关资源
    最近更新 更多