我知道在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>
我想知道将它们用于此目的是否是一个好主意,因为到目前为止我还没有看到其他人这样做。 你觉得怎么样?
答案 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文档,因为他们有更多的例子。