【问题标题】:How do I avoid ExUnit.start() error when running mix test运行混合测试时如何避免 ExUnit.start() 错误
【发布时间】:2020-06-01 16:45:12
【问题描述】:

当我在我的项目上运行 mix test 时,我收到以下错误,我不明白为什么:

$ mix test
Compiling 2 files (.ex)

== Compilation error in file lib/myproject_web/controllers/email_controller_test.ex ==
** (RuntimeError) cannot use ExUnit.Case without starting the ExUnit application, please call ExUnit.start() or explicitly start the :ex_unit app
    expanding macro: ExUnit.Case.__using__/1
    lib/myproject_web/controllers/email_controller_test.ex:2: MyProjectWeb.EmailControllerTest (module)
    (elixir 1.10.1) expanding macro: Kernel.use/2
    lib/myproject_web/controllers/email_controller_test.ex:2: MyProjectWeb.EmailControllerTest (module)

我已经在lib/ 中有一个test_helper.exs 文件,它调用ExUnit.start()。我的设置不寻常,因为我希望在模块旁边而不是在单独的 test 文件夹中进行测试。

【问题讨论】:

  • 我想分享这些信息,因为它让我彻底疯了。我第一次修复它时我什至不知道如何(我删除并重新制作了一堆文件。)我第二次看到它时,我知道绝望。然后我看到了不一致。
  • 当我们运行mix test 时,确保我们位于项目的根目录中很重要。这听起来很基本,但有时我不记得我在项目的子目录中(例如`lib),然后我得到这个错误。

标签: elixir elixir-mix


【解决方案1】:

原来这个错误来自扩展名为.ex而不是.exs的测试文件。使用.ex 然后mix 尝试在运行测试之前将其与其他所有内容一起编译,然后因为ExUnit.start() 在编译时没有被调用而报错。

如果使用.exs 扩展名,则文件不会被编译,而是在ExUnit.start()test_helpers.exs 调用后由mix test 运行。

【讨论】:

    【解决方案2】:

    如果你阅读了mix test的文档:

    此任务启动当前应用程序,加载 test/test_helper.exs 然后需要所有匹配的文件 test/**/*_test.exs 模式并行。

    .exs 文件没有被编译是对的,但是即使它们被编译也不是问题。测试作为脚本运行以避免重复编译,因为它们每次都获得随机顺序,具有不同的输出编译。

    任务首先编译所有文件,然后启动ExUnit 并从*_test.exs 脚本中展开所有宏。为了证明这一点,请查看this piece of code

    defmacro __using__(opts) do
        unless Process.whereis(ExUnit.Server) do
          raise "cannot use ExUnit.Case without starting the ExUnit application, " <>
                  "please call ExUnit.start() or explicitly start the :ex_unit app"
        end
    

    这意味着在您使用 use ExUnit.Case 的文件中,ExUnit 服务器应该在解释这些脚本时启动并运行。

    在您的情况下,即使更改为 .exs,您的测试也不应该正常工作,因为 default configuration 的测试路径是:

     defp default_test_paths do
        if File.dir?("test") do
          ["test"]
        else
          []
        end
    

    相反,您应该使用以下命令调用测试:

    mix test test/some/particular/file_test.exs
    

    【讨论】:

    • 感谢您的信息!我曾在 test_paths: ["lib"] 的某个时间点到 mix.exsproject 部分,这是让这个测试结构与普通的旧 mix test 一起工作所必需的
    猜你喜欢
    • 2021-02-26
    • 1970-01-01
    • 2023-01-10
    • 2021-12-23
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多