2017-05-17 63 views
1

給定一個函數對一個對象的多次調用(比如子進程調用),是否可以模擬特定的子進程調用?目標是確定一個特定的邏輯案例來操縱單元測試。或者這只是嘲笑(或SDET能力)的限制,我需要將更大的功能分解爲更小的功能,以便它們只包含一個子進程調用,並且每個調用都可以被模擬和單獨測試?Python模擬:如何注入一個對象在函數中的特定點?

回答

1

我不知道這是否可能,但你可以使模擬做任何原始的方法會做。

import mock, sys 


def bar(n): 
    print('bar({})'.format(n)) 


def foo(): 
    bar(1) 
    bar(2) 
    bar(3) 


class MockBar(mock.MagicMock): 

    original = staticmethod(bar) 

    def __call__(self, *args, **kwargs): 
     if self.call_count == 1: 
      print('stubbed a call with args {} and kwargs {}'.format(args, kwargs)) 
     else: 
      MockBar.original(*args, **kwargs) 
     super(MockBar, self).__call__(*args, **kwargs) 


with mock.patch.object(sys.modules[__name__], 'bar', MockBar()): 
    foo() 

正如我剛纔嘲笑的唯一目的在於bar了第二個電話,出三個電話總的一個例子。所以運行上面的代碼給出了輸出:

bar(1) 
stubbed a call with args (2,) and kwargs {} 
bar(3) 
相關問題