2017-02-16 3 views
2

Ich habe eine Funktion confirm, die IO-Eingang liest, und in Abhängigkeit von Eingabe, wenn es y (ja) oder n (nein), kehrt sie true/false, sonst nennt es confirm wieder, bis Alle erwarteten y oder n wird eingegeben.Testing rekursive IO prompt in Elixir/Erlang

@spec confirm(binary) :: boolean 
def confirm(question) do 
    answer = question |> IO.gets() |> String.trim() |> String.downcase() 

    case(answer) do 
    "y" -> true 
    "n" -> false 
    _ -> confirm(question) 
    end 
end 

Um zu testen, y und n Fällen ist es einfach:

assert capture_io([input: "y"], fn -> confirm("Question") end) == "Question"

Aber ich habe keine Ahnung, wie IO mehrfach erfassen rekursiven Fall zu testen, lassen Sie uns sagen, wenn auf den ersten Eingang „ungültig "Und dann" y ". Hat elixir eine Möglichkeit, IO-Funktionen so zu testen? Oder haben Sie vielleicht ein paar Vorschläge, wie ich die Funktion umschreiben könnte, um sie einfacher zu testen?

Original Frage https://elixirforum.com/t/testing-recursive-io-prompt/3715

Danke für die Hilfe.

+0

Diese Antwort/Beispiel kann auch helfen - https://stackoverflow.com/a/46630883/1882064 – arcseldon

Antwort

3

Noch nicht getestet, aber was ist nur mit Newline-Zeichen?

assert capture_io([input: "foo\nbar\ny"], fn -> confirm("Question") end) == "Question" 
+0

Es funktioniert, danke. – gintko