2017-02-03 48 views
0

最近,我發現模塊是Python中的單例。這很好,因爲在有些情況下,這種模式很有用。測試單身選項模塊

就我個人而言,我喜歡將它用於各處共享的模塊,如選項。

例如,這裏有一個非常簡單的選項模塊使用argparse:

#options.py 
import argparse 

parser = argparse.ArgumentParser(prog='myoptions') 
parser.add_argument('-c', action='store') 
options = parser.parse_args() 

每當我import options,該代碼被執行一次,變量options包含解析的所有選項。太好了!

除了現在,我想測試這個。但我的方式編碼這使得它很難對其進行測試:

  • 當我導入模塊在我的測試文件,argparse試圖解析argv的,它失敗了,因爲argv的是從單元測試
  • 因爲它只加載和執行一次,所以我只能測試選件模塊的一部分。導入options多次不起作用。

我可以通過在函數中包裝parse_args調用並在每個單元測試中調用此函數來快速解決此問題。但是,在我的「真實」代碼中,無論何時我需要一個選項,我將不得不導入選項模塊,然後執行「包裝函數」,它將解析參數並給出選項。

這是可行的,但它並不漂亮,這是因爲:

  • 我將不得不進口+調用「分析」函數需要一個選項
  • 它將執行的argv每一個解析的任何模塊通常情況下,它應該執行一次。

那麼,我該如何使這個代碼既單元測試又易於使用?

感謝您的幫助!

+0

可能的重複[如何設置sys.argv,以便我可以單元測試?](http://stackoverflow.com/questions/18668947/how-do-i-set-sys-argv-soi-i -can-unit-test-it) – TemporalWolf

+0

對不起,但這不是重複的,至少不是直接的。如果你改變了sys.argv,它將會起作用,但只能進行一次測試,因爲代碼被導入/執行一次。我知道這是因爲我試過:) – sterfield

回答

0

經過一番研究,似乎沒有明顯的解決方案來處理這種情況。

在所有的可能性,我決定把小if周圍的變量解析:

if os.environ.get('UNITTEST', 0): 
    options = None 
else: 
    options = _parser.parse_args() 

然後,我養活ENV瓦爾在單元測試文件UNITTEST=1做的解析單元測試功能。這允許我手動輸入parse_args來測試我的選項,當程序執行時,這些選項會立即被解析。