2017-08-25 43 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(...) 
相關問題