【问题标题】:How to run ExUnit tests within IEx如何在 IEx 中运行 ExUnit 测试
【发布时间】:2017-04-09 21:28:09
【问题描述】:

我正在尝试在测试中启动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

我尝试在 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

代码已正确加载,我可以直接使用TheTest."test adds two numbers"({}) 调用它。但我希望这样做是为了启动整个套件。

【问题讨论】:

  • 你为什么不使用mix
  • 我相信既然你没有使用mix,你应该勇敢地自己启动ExUnit服务器应用程序。
  • 谢谢@simone,这个答案假设这是一个mix 项目。事实并非如此。我没想到需要设置一个混合项目才能做到这一点,就像我不希望设置 Rake 在 RSpec 中运行 Pry 一样。我希望这不是答案。
  • 很好的提示@mudasoba,但:observer.start 显示Elixir.ExUnit.Server 正在运行。你说的是这个吗?如果是这样,问题一定出在其他地方。

标签: elixir ex-unit


【解决方案1】:

根据ExUnit documentationExUnit.run/0 仅应在您不想在调用ExUnit.start/1 时自动启动测试时使用。

你总是需要调用ExUnit.start(),它会自动运行所有的测试,除非你通过autorun: false

【讨论】:

    【解决方案2】:

    我假设您没有使用mix。在运行测试用例之前,您需要将它们加载到ExUnit 服务器。

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

    ExUnit.Server.cases_loaded()
    

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

    ExUnit.Server.modules_loaded()
    

    所以你应该写在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()
    

    我希望这会有所帮助。

    【讨论】:

    • ExUnit.Server.cases_loaded() 已被弃用。请改用 ExUnit.Server.modules_loaded()。
    【解决方案3】:
    alias ExUnit.Assertions
    require Assertions
    Assertions.assert 1==1
    true
    

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多