问题描述
我一直在试图像疯了一样对药剂的使用配置基础嘲笑。我已经定义了我的模拟模块并将其放置在“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”移到那里...