如您所知,rspec
在其测试中支持let
。通过预先定义常见变量并在测试之间共享它们,它非常有用并且可以使代码短路。
如何在ExUnit
中调用此功能?
答案 0 :(得分:7)
我认为使用ExUnit在Elixir上使用相同行为的更好方法是使用setup_all
或setup
。
在运行任何测试之前调用setup_all回调一次以设置测试用例,并在每次测试之前运行所有设置回调。如果测试用例没有测试或所有测试都被过滤掉,则不会运行回调。
可在此处找到完整的文档:http://elixir-lang.org/docs/stable/ex_unit/ExUnit.Callbacks.html
答案 1 :(得分:7)
我认为最接近的模拟是从设置挂钩返回上下文。看看这个改编自the ExUnit.Callbacks documentation的例子:
defmodule AssertionTest do
use ExUnit.Case, async: true
setup do
{:ok, hello: "world"}
end
test "a test", context do
assert(context[:hello] == "world")
end
end
答案 2 :(得分:4)
我认为解决这个问题的一个好方法是,假设你要与$update_posts = "UPDATE user_info SET user_pass='$passwordEncrypted',confirm_pass ='$confPasswordEncrypted'
WHERE $id='$userid'";
绑定的东西是动态的,在你的测试用例中有一个私有函数来计算你需要的值
let
RSpec的defmodule MyModuleTest do
use ExUnit.Case
test "timestamp is a tuple" do
assert is_tuple(my_var())
end
defp my_var() do
:os.timestamp()
end
end
还可以缓存它计算的值;你可以通过使用process dictionary来做到这一点,但这通常是气馁的。在任何情况下,只需将结果存储在测试中的变量中,就可以轻松实现此缓存:
let
它略显冗长,但非常少“神奇”且更明确:)。