我想创建一些可变的边界模块。理想情况下,结果看起来像任何其他模块一样,但是可以在编译时或在配置文件中设置行为。我想我正在寻找像在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.exsconfig/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/

10-13 06:42