在一个进程中多次运行ExUnit测试时,如何避免“警告:重新定义模块Foo”

时间:2016-04-28 22:13:11

标签: elixir mix

我希望能够在正在运行的进程中多次运行ExUnit测试,例如iex

要做到这一点,我的代码看起来有点像这样:

def test do
  # Unload test files
  ["test"]
  |> Mix.Utils.extract_files("*")
  |> Enum.map(&Path.expand/1)
  |> Code.unload_files

  # Reenable tasks
  ~w(loadpaths deps.loadpaths test)
  |> Enum.map(&Mix.Task.reenable/1)

  # Run the test suite
  Mix.Task.run("test", args)

  # Cleanup
  :elixir_config.put(:at_exit, [])
end

这样可行,但会为我的测试文件中定义的每个模块打印test/my_app/foo_test.exs:1 warning: redefining module FooTest

我认为,当我从:elixir_code_server卸载这些文件时,这些警告不会被提出,但事实并非如此。

如果不诉诸沉默stderr等方法,我怎么能沉默或避免这些警告?

似乎有一个编译器标志可以用来抑制这些警告,但是没有明确的公共API来设置这个标志。 我们似乎可以禁用这些警告消息,没有明确的API可以这样做。

elixir_compiler:get_opt/1
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/src/elixir_compiler.erl#L8-L13

请参阅elixir_module:check_module_availability/3,检查elixir_compiler:get_opt(ignore_module_conflict) https://github.com/elixir-lang/elixir/blob/master/lib/elixir/src/elixir_module.erl#L408-L418

2 个答案:

答案 0 :(得分:6)

经过一些尝试和错误的冲击,这是适合我的解决方案:

Code.compiler_options(ignore_module_conflict: false)

干杯!

答案 1 :(得分:0)

这可能会这样做:

mix test --no-compile

或者在您的情况下,将args设置为包含--no-compile,如下所示:

 # Run the test suite
 Mix.Task.run("test","--no-compile")

注意:我现在无法测试该代码的正确性,所以如果错了,请提前道歉。