首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理mix中的配置值

处理mix中的配置值
EN

Stack Overflow用户
提问于 2016-08-01 14:59:15
回答 1查看 1.1K关注 0票数 4

我目前很难处理mix中的配置值(尤其是在运行测试时)。这是我的场景:

  • 我有一个客户端库,具有一些常见的配置值(键、秘密、区域)。
  • 我想测试当没有区域值设置时会发生什么
  • 我在test.exs中没有/config文件

我目前正在这样做(但这不起作用)。正在测试的模块(简化):

代码语言:javascript
复制
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

测试:

代码语言:javascript
复制
setup_all do
  Streamex.start
  Application.put_env :streamex, :key, "KEY"
  Application.put_env :streamex, :secret, "SECRET"
  Application.put_env :streamex, :secret, ""
end

在运行mix test时,主模块(从这些值中设置属性)抛出以下错误,因为它找不到有效值:

代码语言:javascript
复制
lib/streamex/client.ex:36: invalid literal nil in <<>>

我仍然在开始,所以这似乎是显而易见的,但是在阅读了这些文档之后,我找不到解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-01 15:24:59

问题是,您将Application.get_env的返回值存储在一个模块属性中,该属性在编译时进行评估。如果您更改测试中的值,它将不会反映在模块属性中--您将始终得到mix编译该模块时的值,其中包括在编译该模块之前计算config/config.exsmix编译的所有模块。修复方法是将可以更改为函数的变量移动到函数中,并在使用时调用这些函数:

代码语言:javascript
复制
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

请注意,如果这是一个库,并且您希望库的用户能够配置配置文件中的值,则必须在运行时使用函数调用,因为应用程序的依赖项是在应用程序之前编译的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38702094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档