2012-08-29 74 views
2

我想模擬某個模塊以測試使用該模塊的一段代碼。Python:嘲笑我正在測試的模塊正在使用的模塊

也就是說,我有一個模塊my_module,我想測試。 my_module引入外部模塊real_thing,並呼籲real_thing.compute_something()

#my_module 
import real_thing 
def my_function(): 
    return real_thing.compute_something() 

我需要模擬real_thing,這樣在測試它會像fake_thing,我已經創建了一個模塊:

#fake_thing 
def compute_something(): 
    return fake_value 

測試調用my_module.my_function()這就要求real_thing.compute_something()

#test_my_module 
import my_module 
def test_my_function(): 
    assert_something(my_module.my_function()) 

我要補充什麼的測試代碼以便my_function()將在測試內部調用fake_thing.compute_something()而不是real_thing.compute_something()

我想弄清楚如何與Mock做到這一點,但我沒有。

+0

如何把'進口fake_thing爲real_thing'在您的測試文件的頂部? –

+3

我總是發現嘲笑一個模塊的最簡單方法就是直接指向它,並大喊:「哈哈,你是一個模塊!」 –

+0

@David:這不能解決它。測試執行'my_module.my_function()','my_module'不知道它是從測試中調用的。 'my_module'導入'real_thing',因此'real_thing.compute_something()'將被執行,而不管測試模塊中實際導入了哪些模塊。 – snakile

回答

1

只要沒有?破解這個sys.modules

#fake_thing.py 
def compute_something(): 
    return 'fake_value' 

#real_thing.py 
def compute_something(): 
    return 'real_value' 

#my_module.py 
import real_thing 
def my_function(): 
    return real_thing.compute_something() 

#test_my_module.py 
import sys 

def test_my_function(): 
    import fake_thing 
    sys.modules['real_thing'] = fake_thing 
    import my_module 
    print my_module.my_function() 

test_my_function() 

輸出: 'fake_value'

+0

這個想法背後是一旦你蹲模塊名稱,python重用同一個,而不重新加載它。 – gbin

+0

我測試過了,它不起作用。 'my_module.my_function()'仍然不返回假值;它調用'real_thing.calculate_something()'並因此返回實際值。 – snakile

+0

be * sure *你在執行sys.modules技巧之後導入my_module *,否則它將無法工作。 – gbin

0

http://code.google.com/p/mockito-python/

>>> from mockito import * 
>>> dog = mock() 
>>> when(dog).bark().thenReturn("wuff") 
>>> dog.bark() 
'wuff' 

http://technogeek.org/python-module.html - 如何更換,加載模塊動態

+0

你的回答並不能幫助我,因爲在我的問題中還有一個間接的層次:讓我們說'dog.bark()'調用'dog.inhale()',我想模擬'dog.inhale() '因此在測試中,當調用'dog.bark()'時,我稱之爲'dog.inhale()'而不是真正的'dog.inhale()'。如何做到這一點? – snakile

+0

你說得對,我在Python中加入了動態模塊加載的鏈接 – iddqd

相關問題