2017-08-25 41 views
1

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

我想要的是嘲笑模块中的一些方法,并保持其他模式。如果我嘲笑整个模块,那么模块中的每个方法或属性都会被模拟。因此,我可以用任何方法模拟整个模块(只保留特定的方法),而不是像上面所示的那样分别模拟多个方法。

+0

请问您可以发布您正在测试的代码吗?您可以对其进行重构,以便测试可以直接使用测试配置的对象调用它,从而允许您覆盖单个方法或w/e。你在寻找一个黑名单方法来嘲笑一个对象吗? – dm03514

+0

@ dm03514对不起,我无法发布我的代码。不,我正在寻找一个白名单方法(模拟模块中的所有方法,除了几个所需的方法) –

回答

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(...) 
相关问题