如何在IEx中运行ExUnit测试

Man*_*l M 11 elixir ex-unit

我正试图IEx.pry在测试中启动.但是我无法在iex会话中运行测试.请注意,我没有使用mix.

ExUnit.start

defmodule Calc do
  def add(a,b) do
    a + b
  end
end

defmodule TheTest do
  use ExUnit.Case

  test "adds two numbers" do
    require IEx
    IEx.pry
    assert Calc.add(1, 2) == 3
  end
end
Run Code Online (Sandbox Code Playgroud)

我试着用ExUnit.run挂起来运行它并最终超时:

manuel@laptop:~/exercism/elixir/nucleotide-count$ iex test.exs             
Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false]

Interactive Elixir (1.3.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> ExUnit.run
** (exit) exited in: GenServer.call(ExUnit.Server, {:take_async_cases, 8}, 60000)
** (EXIT) time out
 (elixir) lib/gen_server.ex:604: GenServer.call/3
(ex_unit) lib/ex_unit/runner.ex:71: ExUnit.Runner.loop/2
 (stdlib) timer.erl:166: :timer.tc/1
(ex_unit) lib/ex_unit/runner.ex:13: ExUnit.Runner.run/2
Run Code Online (Sandbox Code Playgroud)

代码已正确加载,我可以直接调用它TheTest."test adds two numbers"({}).但是我希望能够推出整个套件.

Ale*_*usa 8

我假设你没有使用mix.您需要ExUnit在运行测试用例之前将其加载到服务器.

在Elixir v1.6之前,你会加载这样的测试:

ExUnit.Server.cases_loaded()
Run Code Online (Sandbox Code Playgroud)

在Elixir v1.6之后你会像这样加载它们(感谢@jeffreymatthias):

ExUnit.Server.modules_loaded()
Run Code Online (Sandbox Code Playgroud)

所以你应该写的代码iex应该是:

ExUnit.start()

defmodule Calc do
  def add(a,b) do
    a + b
  end
end

defmodule TheTest do
  use ExUnit.Case

  test "adds two numbers" do
    require IEx
    IEx.pry()
    assert Calc.add(1, 2) == 3
  end
end

ExUnit.Server.modules_loaded() # Or ExUnit.Server.cases_loaded()

ExUnit.run()
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.

  • ExUnit.Server.cases_loaded() 已被弃用。请改用 ExUnit.Server.modules_loaded()。 (2认同)