2016-12-13 32 views
0

我在我的一些代碼中使用waiting庫來等待條件成立。作爲庫的一部分,當謂詞爲真時,waiting.wait返回True;否則它會拋出異常或根據超時值永遠等待,等等。如何在Python中模擬等待庫?

我想在測試中對其進行修補,以便始終返回True而不進入等待週期。這是我的嘗試:

#!/usr/bin/env python3 

from unittest.mock import Mock 
import waiting 
from waiting import wait 

def test_waiting(): 
    waiting.wait.return_value = True 
    # Below *should* wait forever because it can never be true. 
    # Want to make it return true instead. 
    return wait(lambda: False) 

if __name__ == "__main__": 
    assert(test_waiting()) 

但我發現,它實際上是調用庫的代碼而不是短路返回。

如何在不實際調用代碼的情況下強制此方法簡單地返回一個值(或引發副作用)?

回答

1

您的waiting.wait.return_value = True將不起作用,因爲waiting.wait不是模擬對象。您只向現有的wait函數添加了任意屬性,但該函數不會使用該屬性。

模擬出的wait功能,只需直接嘲笑它:

from unittest import mock 

with mock.patch('__main__.wait'): 
    wait.return_value = True 

沒有必要嘲笑waiting庫的內部,所有你想要在你的代碼出現的情況是,任何使用可調用的wait()立即返回。

請注意,我選擇了__main__模塊修補名wait(),看到Where to patchunittest.mock文檔。

您的實際位置可能不同,如果您在任何地方都使用import waiting,則必須使用mock.patch('waiting.wait')。否則,你一般會將它應用於你使用的相同模塊from waiting import wait中。

+0

嗯,那真是愚蠢的我。 :)完美的作品。乾杯! – erip