2014-03-24 117 views
1

我有一個模塊,我需要測試要求對進口功能,但我不能調用此函數因各種原因模擬功能。所以我嘲笑這個功能,但即使嘲笑它調用導入。呼籲進口

比如我測試mod1.py,看起來像這樣:

import os 

def bar(): 
    return 'foo' 

def dont_call(): 
    os.listdir("C:\\tmp") 

dont_call() 

我的測試看起來是這樣的:

import mock 

@mock.patch("mod1.dont_call") 
def test_mod1(mock_dont_call): 
    import mod1 
    assert mod1.bar()=='foo' 

if __name__=="__main__": 
    test_mod1() 

問題是os.listdir被調用。

我不能改變MOD1,所以我能做些什麼?

我使用python2.7。

爲了把這一背景下我測試打開進口一個數據庫連接,我不同意,但我可以看到它背後的原因的模塊。不幸的是我無法在我的QA機器上訪問這個數據庫。

+0

爲什麼「你好」 *不*打印? – kindall

+0

您無法模擬在全局級別調用的函數。簡單的答案是*不這樣做*。下面Ramu的答案向你展示了一種方法,如果'dont_call()'應該只能在作爲腳本運行時執行。 –

+0

@MartijnPieters這將是對周圍的任何東西編寫測試使用它初始化模塊範圍主要實例,例如博格/單樣模式的問題,核心'logging'模塊和日誌記錄管理器實例。是的,如果可以避免的話,這可能會更好,但它並不總是。 –

回答

1

我找到的解決方法是什麼嘲弄了dont_call打電話給我這樣的事情:

import mock 

@mock.patch("os.listdir") 
def test_mod1(mock_dont_call): 
    import mod1 
    assert mod1.bar()=='foo' 

if __name__=="__main__": 
    test_mod1() 
3

如果你想代碼進口將它們放在以下條件中「不」執行:

在mod1.py,請執行下列操作:

if __name__=="__main__": 
    dont_call() 

這是因爲,在默認情況下,當你導入一個python模塊,其中的所有代碼都會被執行。通過添加上述條件,您明確指出dont_call()僅在作爲腳本運行的文件而不在其他模塊中導入時調用。

+0

我不認爲這解決了OP的問題 - 這是在兩種情況下模塊將被導入的位置,並且一個函數不應該被執行。 – martineau

+0

謝謝你的回答,但正如我所說,我不能編輯mod1.py. – vfxGer