在Elixir/Erlang中测试递归IO提示

3

我有一个名为confirm的函数,它读取IO输入,并根据输入,如果是y(是)或n(否),则返回true/false,否则会再次调用confirm,直到输入了任何预期的yn

@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

要测试 yn 的情况非常容易:

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

但我不知道如何多次捕获 IO 来测试递归的情况,比如说如果第一次输入是 “无效”,然后是 “y”。Elixir 有没有办法像这样测试 IO 函数?或者你是否有一些建议来重写函数以便更轻松地进行测试?

原问题https://elixirforum.com/t/testing-recursive-io-prompt/3715

感谢您的帮助。


这个答案/示例也可能有所帮助 - https://dev59.com/gZfga4cB1Zd3GeqPB9pB#46630883 - arcseldon
1个回答

4
未经测试,但是尝试使用换行符呢?
assert capture_io([input: "foo\nbar\ny"], fn -> confirm("Question") end) == "Question"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接