我试图通过iex使用doctest测试HashSet。如果我运行下面的行,它会给出相同的结果,但是#HashSet<["rockerboo"]>}
不能用语法表示。我想不出一种方法来正确地表达它,我也找不到任何例子。谢谢!
@doc """
Adds user to HashSet in state
## Examples
iex> Elirc.Channel.add_user_to_state("rockerboo", %{users: HashSet.new})
%{users: #HashSet<["rockerboo"]>}
"""
def add_user_to_state(user, state) do
%{state | users: HashSet.put(state.users, user) }
end
在运行mix test
时,我会得到以下错误。
Doctest did not compile, got: (TokenMissingError) lib/elirc/channel.ex:99: missing terminator: } (for "{" starting at line 99)
code: %{users: #HashSet<["rockerboo"]>}
第99行是%{state...
发布于 2015-06-26 22:19:49
您可以以不同的方式构造您的HashSet
,以便它是有效的Elixir表达式。例如,这对我起了作用:
## Examples
iex> Elirc.Channel.add_user_to_state("rockerboo", %{users: HashSet.new})
%{users: ["rockerboo"] |> Enum.into(HashSet.new)}
这也是ExUnit.DocTest documentation在“不透明类型”下推荐的方法。
发布于 2015-06-27 09:13:19
Paweł的答案是正确的。另一种选择是“按摩”文档测试中的数据。例如,这样做是可行的:
iex> state = Elirc.Channel.add_user_to_state("rockerboo", %{users: HashSet.new})
iex> state.users
#HashSet<["rockerboo"]>
或者:
iex> state = Elirc.Channel.add_user_to_state("rockerboo", %{users: HashSet.new})
iex> Enum.to_list(state.users)
["rockerboo"]
我扩展了Paweł链接的doctest部分,包括他的例子和我的例子:test.ex#L77
发布于 2015-06-27 04:31:44
那么,您的问题是,您试图表示一些不可能的东西,一个没有键或没有值的HashDict条目。HashDict.put(state.users, "rockerboo")
将失败,因为put
需要3个参数,一个HashDict、一个键和一个值。不过,假设您有类似于name: "rockerboo"
的东西:
iex> %{users: Enum.into([name: "rockerboo"], HashDict.new)} %{users: #HashDict<[name: "rockerboo"]>}
上述工作如预期的那样。
https://stackoverflow.com/questions/31081845
复制相似问题