Testing 当行为取决于应用程序时,如何测试模块。get_env/3?

Testing 当行为取决于应用程序时,如何测试模块。get_env/3?,testing,elixir,elixir-mix,Testing,Elixir,Elixir Mix,我正在制作一个带有模块的库,当use'd根据目录的内容注入一些函数时,我想测试不同目录的行为。目前,我使用application.get_env/3通过应用程序配置获取目录的路径 如果我正在更改目录Application.put_env/4,这意味着我的测试必须按顺序运行,因为这是一个有效的全局值,对吗 我是否可以取消对应用程序的调用。get_env/3?或者我应该以另一种方式传递值?(例如通过use宏)最简单的方法是将值作为参数传入。您的模块可能依赖于应用程序。get_env仅缺少传入值。比如

我正在制作一个带有模块的库,当
use
'd根据目录的内容注入一些函数时,我想测试不同目录的行为。目前,我使用
application.get_env/3
通过应用程序配置获取目录的路径

如果我正在更改目录
Application.put_env/4
,这意味着我的测试必须按顺序运行,因为这是一个有效的全局值,对吗


我是否可以取消对
应用程序的调用。get_env/3
?或者我应该以另一种方式传递值?(例如通过
use
宏)

最简单的方法是将值作为参数传入。您的模块可能依赖于
应用程序。get_env
仅缺少传入值。比如:

Application.put_env(MyApplication, :some_key, "hello")

defmodule Test do
  def test(string \\ Application.get_env(MyApplication, :some_key)) do
    IO.inspect(string)
  end
end

# Default behaviour    
Test.test           # => "hello"

# In your tests
Test.test("world")  # => "world"

我认为这有一个巨大的缺点:编译时优化。我经常发现自己需要在编译时读取配置并使用它来做一些编译时工作。如果参数被传递到宏中,那么我们仍然可以得到编译时优化。我倾向于这种方法,尽管我想知道是否有更好的方法来处理这个问题。