2016-05-23 7 views
-1

Ich habe eine Konsolenanwendung geschrieben, die auf die Benutzer-char-Eingabe wartet.automatisches Testen der String-Processing-Funktion

Anwendung hat die Funktion:

typedef char *ProcessedDataType; 

    extern ProcessedDataType askUserInput(void){ 
     int i = getchar(); 
     ProcessedDataType local_var = userInputProcessed(i); 
     return ProcessedDataType; 
    } 

    static ProcessedDataType userInputProcessed(int i){ 
     ... 
     return PocessedDataType; 
    } 

Nun würde ich diese Funktion für mehrere Eingänge testen möchten. Wo also normalerweise der Cursor für Benutzereingaben blinkt, werden nun automatisch Einträge aus einer Datei zurückgegeben, die die Auswahlbuchstaben enthält. Dies würde dann gegen das bekannte Ergebnis geltend gemacht werden.

runTest{ 

     // when console gets input 'A' 
     ProcessedDataType local_var = askUserInput(); 
     assert('ProcessedA' == local_var);  } 

     // when console gets input 'B' 
     ProcessedDataType local_var = askUserInput(); 
     assert('ProcessedB' == local_var);  } 

     // when console gets input 'C' 
     ProcessedDataType local_var = askUserInput(); 
     assert('ProcessedC' == local_var);  } 

Wie stelle ich beim Testen die gleichen String-Parameter für diese Funktion bereit? Wie kann ich ‚Futtermittel‘ die Konsole die Eingänge A, B, C, etc ...

Ich will nicht Präprozessoren verwenden, wie hier: How to unit test c functions involving IO?

+0

Wie wird 'getchar' 9 Zeichen erhalten? – aschepler

+0

sehr guter Punkt – hewi

+0

'Return ProcessedDataType;' WTF? Bitte liefern Sie kompilierbaren Code. Und was ist 'assert ('ProcessedA' == local_var); Bitte posten Sie das [Minimal, Complete und Verifable Beispiel] (http://stackoverflow.com/help/mcve), das zeigt, was Sie versucht haben, nicht irgendeine Fantasie. –

Antwort

0

Andere als die offensichtliche, dass „getchar“ nur geht um einen Charakter zu sammeln .... Ich habe daher diese Methode durch eine Methode "getchars" ersetzt, aber Sie können schließlich mit dem ersetzen, was Sie tatsächlich brauchen.

Sie müssen in Ihrem Test die Methode vortäuschen, die Benutzereingaben sammeln würde.

#define getchars mockgetchars 

const char* expected; 
char mockgetchars() { 
    return expected; 
} 

expected = "AAAAAAA\n"; 
ProcessedDataType local_var = askUserInput(); 
assert("AAAAAAA", local_var); 
+0

Wenn Sie getchars verwenden möchten, können Sie Ihre App so aktualisieren, dass getchars mehr als einmal aufgerufen werden. Sie können die getckar-Rückgabe mit "expected ++" ersetzen. –

+0

gibt es keine Möglichkeit, eine Datei in die Befehlszeile zu pipen ? – hewi

+0

Möglich, aber Sie verlieren die Kontrolle zwischen Ihrem SUT und dem Testkabelbaum Sie könnten aus einer Datei in Ihrem Testkabelbaum lesen, um den "erwarteten" Wert zu erhalten. –