ExUnit.CaptureIO по-прежнему ожидает ввода при нескольких вызовах IO.read - PullRequest
0 голосов
/ 31 октября 2018

Рассмотрим следующий минимальный пример [?]:

defmodule Foo do
  def bar() do
    n = IO.read(:line) |> String.trim() |> String.to_integer()
    for _ <- 0..n - 1 do
      IO.read(:line) |> IO.write()
    end
  end
end

import ExUnit.CaptureIO
capture_io("2\nabc\ndef", Foo.bar)

Я заглянул в документацию, и она не накладывает никаких ограничений на использование ExUnit.CaptureIO, но вышеупомянутый код зависает, ожидая первую строку ввода, как если бы он не был передан. Я что-то пропустил?

Если это имеет значение, я использую Elixir 1.7.3.

1 Ответ

0 голосов
/ 01 ноября 2018

Второй аргумент capture_io должен быть функцией для запуска с включенным захватом. Здесь вы передаете результат выполнения Foo.bar. Это навсегда, как и ожидание ввода от stdio, которое никогда не приходит. Короче говоря, вам нужно передать его как функцию:

capture_io("2\nabc\ndef", &Foo.bar/0)

потому что Foo.bar совпадает с Foo.bar().

...