2016-03-31 44 views
1

我寫了下面的函數,它是在my_script.py單元測試用於測試目的的命令行參數:Python的單元測試:模仿

def _parse_args(): 
    parser = argparse.ArgumentParser(
     description='Script to configure appliance.' 
    ) 
    parser.add_argument('--config_file', 
         help='Path to a JSON configuration file') 
    print parser.parse_args() 
    return parser.parse_args() 

我想創建一個單元測試來模擬命令行提示:

myscript.py --config_file test.json 

這是我到目前爲止有:

def test_parse_arg_test_config(self): 

     test ={ 
       "name": "test_name", 
       "category": "test_category" 
      } 

     # set the fake command line prompt to be: 
     # myscript.py --config_file test 
     # (where test is defined above) 

     self.assertEquals(my_script._parse_args().config_file, test) 

這顯然是不全面的,但I W因爲想知道如果我正在接近這個正確的方式,因爲_parse_args沒有接受任何輸入,我不知道用另一種方式來模仿一個配置文件被傳遞給函數。

+0

你應該做的是模擬ArgumentParser,所以你得到'parse_args'返回你想用來測試你的代碼的數據結構。 [Mock](http://www.voidspace.org.uk/python/mock/getting-started.html)文檔相當不錯,有幾個例子可以幫助你。 – idjaw

+0

我相信你可以做'parser.parse_args([「my_script.py」,「--config_file」,「test」])' – zondo

+0

@zondo我試過了,但_parse_args函數本身並不包含任何參數。這會產生以下錯誤:「TypeError:_parse_args()不帶任何參數(給出1)」# – Catherine

回答

2

要通過ARGS到函數中添加參數args

def _parse_args(args): 
    parser = argparse.ArgumentParser(
     description='Script to configure appliance.' 
    ) 
    parser.add_argument('--config_file', 
         help='Path to a JSON configuration file') 
    print parser.parse_args(args) 
    return parser.parse_args(args) 

現在你可以這樣調用它:

self.assertEquals(my_script._parse_args(["--config_file", "test"]).config_file,"test") 
+0

非常感謝!這個工程,但我想知道你知道爲什麼如果我刪除引號測試它失敗,即使我指定了測試? – Catherine

+0

argparse是命令行選項,參數和子命令的解析器。它不用於解析在參數中指定的文件。 – Dmitry

+0

它只是讀取字符串 '--config_file test.json' 並創建一個易於使用且包含config_file的名稱的Namespace對象。 如果你想看看test.json中有什麼,你必須先讀取文件: 'import json json.load(my_script._parse_args([「 - config_file」,「test」])。config_file) 和比你可以比較它與測試沒有報價 – Dmitry