在ExUnit中模拟`let`

时间:2016-04-22 06:18:12

标签: elixir phoenix-framework

如您所知,rspec在其测试中支持let。通过预先定义常见变量并在测试之间共享它们,它非常有用并且可以使代码短路。

如何在ExUnit中调用此功能?

3 个答案:

答案 0 :(得分:7)

我认为使用ExUnit在Elixir上使用相同行为的更好方法是使用setup_allsetup

  

在运行任何测试之前调用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

它略显冗长,但非常少“神奇”且更明确:)。