2017-02-16 37 views
2

У меня есть функция confirm, которая считывает ввод IO, и в зависимости от входных данных, если это y (да) или n (нет), она возвращает true/false, в противном случае он снова вызывает confirm, пока любые ожидаемые y или n.Тестирование рекурсивного IO приглашения в 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 

Чтобы проверить y и n случаев это легко:

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

Но я понятия не имею, как захватить IO несколько раз, чтобы проверить рекурсивный случай, скажем, если на первый вход является «недействительным ", а затем" y ". Есть ли у эликсира какой-либо способ проверить функции ввода-вывода, подобные этому? Или, может быть, у вас есть некоторые предложения, как я могу переписать функцию, чтобы проверить ее проще?

Оригинальный вопрос https://elixirforum.com/t/testing-recursive-io-prompt/3715

Спасибо за помощь.

+0

Этот ответ/пример может помочь - https://stackoverflow.com/a/46630883/1882064 – arcseldon

ответ

3

Невеста, но как насчет использования символов новой строки?

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

Он работает, спасибо. – gintko

 Смежные вопросы

  • Нет связанных вопросов^_^