在ExUnit

时间:2016-02-07 13:54:33

标签: elixir elixir-framework

我知道在Elixir中,如果您想要干燥测试并在它们之间共享数据(http://elixir-lang.org/docs/v1.0/ex_unit/ExUnit.Callbacks.html),建议您设置上下文。

这种方法的问题在于您无法在模式匹配中直接使用context[:key](您将收到编译错误cannot invoke remote function Access.get/2 inside match)。因此,每当您想要使用上下文变量进行模式匹配(而不是DRY)时,仍然需要额外的步骤将context[:key]分配给变量

在测试之间共享数据的另一个选项是模块属性(http://elixir-lang.org/getting-started/module-attributes.html)。您只需定义@key <value>并在测试中将其用作@key(在编译时,@ key将替换为您指定的<value>

我想知道将它们用于此目的是否是一个好主意,因为到目前为止我还没有看到其他人这样做。 你觉得怎么样?

1 个答案:

答案 0 :(得分:1)

所以,首先,我可能会改用Elixir 1.1或1.2。那里有地图改进。您链接到1.0文档,这些文档有点过时。

第二件事是,您可以使用模式匹配从上下文中获取变量。以下是1.2 ExUnit docs

的示例
defmodule KVTest do
  use ExUnit.Case

  setup do
    {:ok, pid} = KV.start_link
    {:ok, [pid: pid]}
  end

  test "stores key-values", %{pid: pid} do
    assert KV.put(pid, :hello, :world) == :ok
    assert KV.get(pid, :hello) == :world
  end
end

测试的第二个参数是上下文,但不是访问pid成员,而是匹配pid。现在你可以像普通变量一样使用它。您可以在其上进行模式匹配并固定它。它不仅仅是DRY,你还要确切地说明你所依赖的背景。它更简洁,更明确。

我真的建议阅读1.2文档,因为他们有更多的例子。