2014-03-30 109 views
3

在Python中使用mock,頂級包(如argparse)不能完全修補 - 大概是因爲沒有補丁的參考。一種解決方案是將每個單獨的調用修補到包中(比如argparse.ArgumentParser)。理論上,如果添加對包的調用時沒有相應的補丁,那麼在單元測試期間會導致意外調用導入。蟒蛇模擬補丁頂級包

雖然解決方法並不是那麼不方便,但它完全適用於像argparse這樣的補丁包。 mock_open似乎使用__main__.open修補內置open()一些詭計。這是如何工作的,並且可以使用類似的惡作劇來修補頂層包?

回答

3
import unittest.mock as mock 

mock_argparse = mock.Mock() 
with mock.patch.dict('sys.modules', argparse=mock_argparse): 
    import argparse 
    print(argparse.ArgumentParser()) 
# <Mock name='mock.ArgumentParser()' id='140681471282448'> 

至於mock_open修補:

m = mock_open() 
with patch('__main__.open', m, create=True): 

好像它創建__main__.open與陰影模擬對象屬性的內置版本,如果你的模塊中定義的open()功能。我想對於實際測試,你應該補丁module_x.open()其中「module_x」是實際調用open()的模塊。