我有一个名为Auth.app_id
的函数,它首先尝试从应用程序的配置中读取app_id
,如果缺少则会查找系统环境。
测试此类功能的最佳做法是什么?当然,事先使用Application.put_env
和System.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。
答案 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_id
但app_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')
}
})