ExUnit v1.9.4 ExUnit.CaptureIO View Source

Functionality to capture IO for testing.

Examples

defmodule AssertionTest do
  use ExUnit.Case

  import ExUnit.CaptureIO

  test "example" do
    assert capture_io(fn -> IO.puts("a") end) == "a\n"
  end

  test "checking the return value and the IO output" do
    fun = fn ->
      assert Enum.each(["some", "example"], &IO.puts(&1)) == :ok
    end

    assert capture_io(fun) == "some\nexample\n"
    # tip: or use only: "capture_io(fun)" to silence the IO output (so only assert the return value)
  end
end

Link to this section Summary

Link to this section Functions

Captures IO generated when evaluating fun.

Returns the binary which is the captured output.

By default, capture_io replaces the group_leader (:stdio) for the current process. Capturing the group leader is done per process and therefore can be done concurrently.

However, the capturing of any other named device, such as :stderr, happens globally and requires async: false.

When capturing :stdio, if the :capture_prompt option is false, prompts (specified as arguments to IO.get* functions) are not captured.

A developer can set a string as an input. The default input is an empty string (which is equivalent to :eof).

Examples

iex> capture_io(fn -> IO.write("john") end) == "john"
true

iex> capture_io(:stderr, fn -> IO.write(:stderr, "john") end) == "john"
true

iex> capture_io("this is input", fn ->
...>   input = IO.gets("> ")
...>   IO.write(input)
...> end) == "> this is input"
true

iex> capture_io([input: "this is input", capture_prompt: false], fn ->
...>   input = IO.gets("> ")
...>   IO.write(input)
...> end) == "this is input"
true

Returning values

As seen in the examples above, capture_io returns the captured output. If you want to also capture the result of the function executed inside the capture_io, you can use Kernel.send/2 to send yourself a message and use ExUnit.Assertions.assert_received/2 to match on the results:

capture_io([input: "this is input", capture_prompt: false], fn ->
  send(self(), {:block_result, 42})
  # ...
end)

assert_received {:block_result, 42}
Link to this function

capture_io(device, input, fun)

View Source