Как я могу протестировать многострочный вывод в Elixir?

Как я могу протестировать следующий код?

["one", "two", "three"]) |> Enum.each(&IO.puts(&1))
one
two
three
:ok

Мой тест в настоящее время выглядит так, но он терпит неудачу, потому что IO.puts возвращает :ok, а не строки, и, вероятно, не включает символы новой строки в полную строку.

assert ["one", "two", "three"]) |> Enum.each(&IO.puts(&1)) == """
one
two
three
"""

Возможно, IO.puts не подходит для этого варианта использования. Если да, то какую альтернативу я могу использовать?

Заранее спасибо.


person FelixFortis    schedule 01.11.2016    source источник


Ответы (1)


Используйте capture_io.

fun = fn -> ["one", "two", "three"] |> Enum.each(&IO.puts/1) end
assert capture_io(fun) == "one\ntwo\nthree\n"
person Martin Svalin    schedule 01.11.2016
comment
Спасибо за отличный ответ. Есть ли способ, которым doctest может обрабатывать начальные пробелы? моя_строка - person FelixFortis; 02.11.2016
comment
Извините за путаницу, я посмотрел, и doctest больше не поддерживает захват io. Я отредактировал свой ответ, так как часть о doctest была неправильной. - person Martin Svalin; 02.11.2016