在 Elixir/Erlang 中测试递归 IO 提示
Testing recursive IO prompt in Elixir/Erlang
我有一个函数 confirm
,它读取 IO 输入,根据输入,如果它是 y
(是)或 n
(否),它 returns true/false
,否则它会再次调用 confirm
,直到输入任何预期的 y
或 n
。
@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 来测试递归情况,假设第一个输入是 "invalid",然后是 "y"。 elixir 有没有办法像这样测试 IO 函数?或者您是否有一些建议,我可以如何重写函数以更轻松地测试它?
原题https://elixirforum.com/t/testing-recursive-io-prompt/3715
感谢您的帮助。
未经测试,但只使用换行符怎么样?
assert capture_io([input: "foo\nbar\ny"], fn -> confirm("Question") end) == "Question"
我有一个函数 confirm
,它读取 IO 输入,根据输入,如果它是 y
(是)或 n
(否),它 returns true/false
,否则它会再次调用 confirm
,直到输入任何预期的 y
或 n
。
@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 来测试递归情况,假设第一个输入是 "invalid",然后是 "y"。 elixir 有没有办法像这样测试 IO 函数?或者您是否有一些建议,我可以如何重写函数以更轻松地测试它?
原题https://elixirforum.com/t/testing-recursive-io-prompt/3715
感谢您的帮助。
未经测试,但只使用换行符怎么样?
assert capture_io([input: "foo\nbar\ny"], fn -> confirm("Question") end) == "Question"