2016-03-31 4 views
1

ich einen Komponententest für die folgende Funktion schreibe, die in my_script.py ist:Python Unit Test: Mimic eine Befehlszeilenargument für Testzwecke

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() 

Ich möchte ein Unit-Test erstellen um den Befehl zu imitieren Aufforderung:

myscript.py --config_file test.json 

Dies ist, was ich bisher:

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) 

Es ist offensichtlich unvollständig, aber ich w Ich frage mich, ob ich mich dem richtigen Weg nähere, da _parse_args keine Eingaben aufnimmt. Ich kenne keine andere Möglichkeit, eine Konfigurationsdatei nachzuahmen, die in die Funktion übergeben wird.

+0

Was sollten Sie tun, ist Mock ArgumentParser, so dass Sie parse_args' erhalten 'zurückzukehren die Datenstruktur, die Sie zum Testen Ihres Codes verwenden möchten. Die [Mock] (http://www.voidspace.org.uk/python/mock/getting-started.html) Dokumentation ist ziemlich gut, und es gibt einige Beispiele, die Ihnen helfen werden. – idjaw

+0

Ich glaube, Sie können 'parser.parse_args ([" my_script.py "," --config_file "," test "])' – zondo

+0

@zondo Ich habe das versucht, aber die _parse_args Funktion nimmt keine Argumente selbst. Dies erzeugt den folgenden Fehler "TypeError: _parse_args() akzeptiert keine Argumente (1 gegeben)" – Catherine

Antwort

2

Um args in die Funktion hinzufügen Argument 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) 

Jetzt haben Sie es so nennen kann passieren:

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

Vielen Dank! Das funktioniert, aber ich frage mich, weißt du warum, wenn ich die Anführungszeichen um Test entfernen, schlägt es fehl, obwohl ich Test angegeben habe? – Catherine

+0

argparse ist der Parser für Befehlszeilenoptionen, Argumente und Unterbefehle. Es ist nicht zum Parsen von Dateien, in Argumenten angegeben. – Dmitry

+0

Es liest nur die Zeichenfolge '--config_file test.json' und erstellt ein Namespace-Objekt, das einfach zu verwenden ist und den Namen der config_file enthält. Wenn Sie sehen wollen, was sich in der test.json befindet, müssen Sie zuerst die Datei lesen: 'import json json.load (meine_script._parse_args ([" - config_file "," test "]). Config_file)' und dann können Sie es mit dem Test ohne Anführungszeichen vergleichen – Dmitry