有没有办法在 Elixir 中使用 Doctest 测试 IO 输出?

Is there a way to test an IO output using Doctest in Elixir?

我完全同意为此编写 "normal" 捕获 IO 的测试。

只想知道是否可以使用 Doctest

例如:

defmodule CLI do

  @doc """
  Politely says Hello.

  ## Examples

      iex> CLI.main([])
      "Hello dear person." # this would be the expected IO output
  """
  def main(args) do
    IO.puts "Hello dear person."
  end
end

defmodule CLITest do
  use ExUnit.Case
  doctest CLI
end

您可以使用与正常测试相同的函数:ExUnit.CaptureIO.capture_io。这可能不是适合 doctests 的函数,但当您向该函数添加更多功能时。

defmodule CLI do
  @doc """
  Politely says Hello.

  ## Examples

      iex> import ExUnit.CaptureIO
      iex> capture_io(fn -> CLI.main([]) end)
      "Hello dear person.\n"
  """
  def main(args) do
    IO.puts "Hello dear person."
  end
end
$ mix test
.

Finished in 0.03 seconds
1 test, 0 failures