测试配置/系统env getters

时间:2016-03-04 10:38:13

标签: elixir

我有一个名为Auth.app_id的函数,它首先尝试从应用程序的配置中读取app_id,如果缺少则会查找系统环境。

测试此类功能的最佳做法是什么?当然,事先使用Application.put_envSystem.put_env内部测试是非常糟糕的做法,因为我们使用全局变量进行操作并且不可能进行异步测试。

test "getting config variables" do
  Application.put_env(:appname, :app_id, "123")
  assert Auth.app_id === "123"
end

test "getting env variables" do
  System.put_env("APPNAME_APP_ID", "111")
  assert Auth.app_id === "111"
end

这就是getter函数在内部的表现:

def app_id do
  Application.get_env(
    :appname,
    :app_id,
    System.get_env("APPNAME_APP_ID")
  )
end

问题是我有很多使用这些getter的函数,比如使用app_id作为参数返回url。

5 个答案:

答案 0 :(得分:2)

没有办法解决这些变量是全局的(不看嘲笑)。我的建议是不要同时运行测试(不使用<activity android:name="..." android:windowSoftInputMode="adjustResize" /> 中的async: true)或不测试use ExUnit函数(因为它非常简单)。

答案 1 :(得分:1)

我有类似的情况,最终使用了这样的内容:

defmodule MyApp.ConfigTest do
  use ExUnit.Case, async: false

  setup do
    previous_env = System.get_env()
    on_exit(fn -> System.put_env(previous_env) end)
  end

  test "I can change environment for this test only" do
    System.put_env("HOME", "/tmp")
    assert System.get_env("HOME") == "/tmp"
  end

  test "Should not affect other tests" do
    assert System.get_env("HOME") != "/tmp"
  end
end

重要的是on_exit回调和async: false的定义。

我不是100%确信它是安全的,甚至还不是很漂亮。

答案 2 :(得分:0)

您可以做的是编写shell代码来调用测试。编写设置环境变量的shell代码,然后执行测试。你的shell代码可以使用sed或沿着这些行的东西修改config.exs,使其具有值或不具有取决于你想要测试的方式的值。

正如他们现在所做的那样,测试几乎没有增加任何价值。现在你正在有效地测试frama-c-gui模块。

如果既未设置地址(config.exs也未设置环境变量),也不要忘记测试代码。

答案 3 :(得分:0)

正如@whatyouhide所说,你无法解决这些变量是全局的事实所以我要做的就是隔离这个问题:

  • 使用app_id隔离自己的测试文件中的async: false测试,并按照您的方式进行测试;
  • 对于结果实际取决于app_id;
  • 的值的所有测试,请执行相同的操作
  • 对于使用app_idapp_id的实际值不影响结果的所有测试,请在setup_all回调中设置合理值,以便仅设置一次对于整个测试文件。

这样,大多数测试都可以运行异步,只有那些结果直接依赖于app_id的值才会运行非异步。

答案 4 :(得分:0)

如果您使用的是 Mock framework,您可以执行以下操作。

 app.get('/admin-dashboard', (req, res) => {
    if (req.session.loggedin) {

     
      
        const location = {
            lat: 43.955540,
            lon: -79.480950
        }
         
    

        getWeather(location)
            .then(weather => {
                console.log(`The temperature here is: ${weather.temperature.value}`)
               
         
          
        res.render("admin-dashboard", {
            page_title: "admin-dashboard",
            FN: req.session.firstname,
            LN: req.session.lastname,
            weather: ${weather.temperature.value},
          });
        }).catch(err => console.log(err));
    } else {
        res.render('login.ejs')
    }
})