Wie kann ich eine Funktion mit gets.chomp testen?

7

Ich habe eine einfache Funktion mit gets.chomp wie folgt:

%Vor%

Ich möchte es mit ruby in TestCase suite wie folgt testen:

%Vor%

Das Problem ist, dass der gets.chomp den Test abbricht, wenn ich diesen Test starte, weil der Benutzer etwas eingeben muss. Gibt es eine Möglichkeit, Benutzereingaben mit nur ruby ? Zu simulieren?

    
user886596 05.06.2013, 19:53
quelle

3 Antworten

7

Sie trennen zuerst die zwei Anliegen der Methode:

%Vor%

Und dann testest du den zweiten separat.

%Vor%

Wie für die erste, Sie können

  1. Testen Sie es von Hand und verlassen Sie sich darauf, dass es nicht bricht (empfohlene Vorgehensweise, TDD ist keine Religion).
  2. Holen Sie sich die untergeordnete Version der fraglichen Shell und lassen Sie sie den Benutzer imitieren und vergleichen ob get_action tatsächlich erhält, was der Benutzer eingibt.

Obwohl dies eine praktische Antwort auf Ihr Problem ist, weiß ich nicht, wie 2. zu tun ist. Ich kann nur den Benutzer hinter dem Browser ( watir-webdriver ) imitieren und nicht hinter der Shell-Sitzung.

    
Boris Stitnicky 05.06.2013, 20:01
quelle
12

Sie könnten eine Pipe erstellen und ihr "read end" zuweisen "bis $stdin . Das Schreiben in das "Schreibende" der Pipe simuliert dann die Benutzereingabe.

Hier ist ein Beispiel mit einer kleinen Hilfsmethode with_stdin zum Einrichten der Pipe:

%Vor%     
Stefan 05.06.2013 21:27
quelle
3

Sie könnten die IO-Abhängigkeit injizieren. gets liest von STDIN , das ist die Klasse IO . Wenn Sie ein weiteres Objekt IO in Ihre Klasse injizieren, können Sie StringIO in Ihren Tests verwenden. Etwas wie das:

%Vor%

Tests:

%Vor%

Dadurch kann Ihre Klasse mit jedem IO-Datenstrom (TTY, Datei, Netzwerk usw.) interagieren.

Um es auf der Konsole im Produktionscode zu verwenden, übergeben Sie STDIN und STDOUT :

%Vor%     
Jim Stewart 05.06.2013 22:29
quelle

Tags und Links