我想创建一些可变的边界模块。理想情况下,结果看起来像任何其他模块一样,但是可以在编译时或在配置文件中设置行为。我想我正在寻找像在erlang中定义的东西
说我有一个SystemClock模块和一个DummyClock元组模块。理想情况下,“时钟”模块应该是在配置文件中选择的上述两个模块之一。
在config/test.ex
中
define(Clock, {DummyClock, 12345678})
后来
Clock.now
# => 12345678
在
config/prod.ex
中define(Clock, SystemClock)
后来
Clock.now
# => 32145687
最佳答案
我认为最简单的方法是使用configs和Application.get_env/2
。
在config/test.exs
中
config :my_application, clock: DummyClock
在
config/dev.exs
和config/prod.exs
中config :my_application, clock: RealClock
在使用时钟的代码中
defp clock, do: Application.get_env(:my_application, :clock)
def my_function(arg1, arg2) do
now = clock.now
# ...
end
关于testing - 在Elixir中定义一个常量模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32860342/