2017-08-02 105 views
1

如何測試python函數被調用,而不改變它的行爲檢查函數是否在不改變其行爲的情況下被調用

有很多相關的帖子,但我找不到他們中的一個,涵蓋了一切:

基本上,我只是需要監視函數來知道它是否被調用。

例如,下面的代碼片段具有非常令人驚訝的行爲

from unittest.mock import patch 

def func(a,b): 
    print('was called') 
    return a * b 

with patch('test.func') as patched_function: 
    print(func(4,5)) 

print(patched_function.called) 

輸出:

<MagicMock name='func()' id='1721737249456'> 
True 
was called 
20 
False 

雖然我只是期待

was called 
20 
True 
+0

使用您在第一次調用設置爲TRUE;一個全局變量? –

+0

如果'func'在一個你不能修改的模塊內,這幾乎總是你在修補時要查找的內容 – Overdrivr

+0

你也可以使用一個全局變量作爲計數器的次數一個函數被調用。例如:'def func(i):i + = 1' –

回答

1

你應該爲函數創建一個裝飾像這樣:

class CheckCall(object): 
    called = False 

    def __init__(self, func): 
     self.func = func 

    def __call__(self *args, **kwargs): 
     self.called = True 
     return self.func(*args, **kwargs) 

那麼你可以申請你的裝飾,像這樣

with patch('test.func') as patched_function: 
    patched_function = CheckCall(patched_function) 
    print(patched_function.called) # Prints False 
    patched_function(...) 
    print(patched_function.called) # Prints True 
+0

我認爲它已經在單元測試中實現了。如果使用unittest沒有答案,我會接受你的 – Overdrivr

相關問題