我目前正在努力处理混合中的配置值(特别是在运行测试时).这是我的情景:
test.exs档案/config我现在正在这样做(这不起作用).正在测试的模块(简化):
defmodule Streamex.Client do
@api_region Application.get_env(:streamex, :region)
@api_key Application.get_env(:streamex, :key)
@api_secret Application.get_env(:streamex, :secret)
@api_version "v1.0"
@api_url "api.getstream.io/api"
def full_url(%Request{} = r) do
url = <<"?api_key=", @api_key :: binary>>
end
end
Run Code Online (Sandbox Code Playgroud)
测试:
setup_all do
Streamex.start
Application.put_env :streamex, :key, "KEY"
Application.put_env :streamex, :secret, "SECRET"
Application.put_env :streamex, :secret, ""
end
Run Code Online (Sandbox Code Playgroud)
运行时会发生的情况mix test是主模块(从这些值设置属性)会抛出以下错误,因为它找不到有效值:
lib/streamex/client.ex:36: invalid literal nil in <<>>
Run Code Online (Sandbox Code Playgroud)
我还在开始,所以这看起来很明显,但在阅读完文档后我找不到解决方案.
问题是您将Application.get_env模块属性的返回值存储在编译时进行评估.如果更改测试中的值,它将不会反映在模块属性中 - 您将始终获得mix编译该模块时存在的值,其中包括评估config/config.exs以及mix编译该模块之前编译的所有模块.修复方法是将可以更改的变量移动到函数中,并在使用它们时调用这些函数:
defmodule Streamex.Client do
@api_version "v1.0"
@api_url "api.getstream.io/api"
def full_url(%Request{} = r) do
url = <<"?api_key=", api_key :: binary>>
end
def api_region, do: Application.get_env(:streamex, :region)
def api_key, do: Application.get_env(:streamex, :key)
def api_secret, do: Application.get_env(:streamex, :secret)
end
Run Code Online (Sandbox Code Playgroud)
请注意,如果这是一个库,并且您希望库的用户能够在其配置文件中配置值,则必须在运行时使用函数调用,因为应用程序的依赖项是在应用程序之前编译的.
| 归档时间: |
|
| 查看次数: |
667 次 |
| 最近记录: |