Elixir 的 Mix 是否可以从多个路径加载源?

问题描述

我一直在试图像疯了一样对药剂的使用配置基础嘲笑。我已经定义了我的模拟模块并将其放置在“test/”目录下的“.ex”文件中。然后每当我运行“混合测试”时,它都无法加载模块。但是,如果我将模拟移动到“lib/”下,则一切正常。所以我想知道我的配置和文件结构是否缺少某些东西,或者是否有办法告诉“mix”除了“lib/”之外在另一个目录中查找源文件

文件结构:

public class StarHotel extends Building implements ResourceProvider
    public void provideResourceFor(Base base) {
        base.addResource(Resource.FOOD,8);
        base.addResource(Resource.HAPPInesS,2);
    }
}

config/dev.exs

my_app/
 |
 + -- lib/
 |     my_lib.ex
 |     my_service.ex
 |
 + ---test/
 |     test_helper.ex
 |     my_service_mock.ex
 |     my_lib_test.exs
 |
 +----config/
       config.exs
       test.exs
       prod.exs
       dev.exs

config/test.exs

import Config
config :my_app,my_service: MyApp.MyService

my_lib.ex

import Config
config :my_app,my_service: MyApp.MyServiceMock

my_service.ex

defmodule MyLib do
  @my_service Application.get_env(:my_app,:my_service)

  def do_something,do: @my_service.do_something_else
end

my_service_mock.ex

defmodule MyApp.MyService do
  def do_something_else,do: { :ok,"Running business task" }
end

my_lib_test.ex

defmodule MyApp.MyServiceMock do
  def do_something_else,"Faking business task" }
end

命令“mix test”失败并出现以下错误

defmodule MyApp.MyLibTest do
  use ExUnit.Case

  alias MyApp.MyLib

  test "MyList.do_something/0 should do it's thing" do
    assert { :ok,"Faking business task" } = MyLib.do_something
  end
end

我正在运行 elixir 1.11.2。

解决方法

好吧,我终于在 Elixir 论坛上的这篇帖子中找到了解决方案:https://elixirforum.com/t/load-module-during-test/7400

事实证明,“Mix.Project”中有一个变量指定了源的路径:

所以在我的“mix.exs”中我做了以下事情:

  def project do
    [
      ...
      elixirc_paths: elixirc_paths(Mix.env),...
    ]
  end

  defp elixirc_paths(env_name) do
    case env_name do
      :test -> ["lib","test/mockery"]
       _ -> ["lib"]
    end
  end

当然,我添加了目录“test/mockery/”并将“MyApp.MyServiceMock”移到那里...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...