在 doctest 中测试哈希集
Testing HashSets in doctest
我正在尝试通过 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...
您可以用不同的方式构造您的 HashSet
,使其成为有效的 Elixir 表达式。例如,这对我有用:
## Examples
iex> Elirc.Channel.add_user_to_state("rockerboo", %{users: HashSet.new})
%{users: ["rockerboo"] |> Enum.into(HashSet.new)}
这也是ExUnit.DocTest documentation在"Opaque Types"
下推荐的方法
好吧,您的问题是您试图表示不可能的东西,即没有键或没有值的 HashDict 条目。 HashDict.put(state.users, "rockerboo")
会失败,因为 put
需要 3 个参数,一个 HashDict,一个键和一个值。假设你有类似 name: "rockerboo"
的东西:
iex> %{users: Enum.into([name: "rockerboo"], HashDict.new)}
%{users: #HashDict<[name: "rockerboo"]>}
以上按预期工作。
Paweł 的回答是正确的。另一种选择是 "massage" doctest 中的数据。例如,这会起作用:
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 部分以包括他和我的示例:https://github.com/elixir-lang/elixir/blob/64e5f4876007d840edee3040c43e8f98095b8e3d/lib/ex_unit/lib/ex_unit/doc_test.ex#L77
我正在尝试通过 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...
您可以用不同的方式构造您的 HashSet
,使其成为有效的 Elixir 表达式。例如,这对我有用:
## Examples
iex> Elirc.Channel.add_user_to_state("rockerboo", %{users: HashSet.new})
%{users: ["rockerboo"] |> Enum.into(HashSet.new)}
这也是ExUnit.DocTest documentation在"Opaque Types"
下推荐的方法好吧,您的问题是您试图表示不可能的东西,即没有键或没有值的 HashDict 条目。 HashDict.put(state.users, "rockerboo")
会失败,因为 put
需要 3 个参数,一个 HashDict,一个键和一个值。假设你有类似 name: "rockerboo"
的东西:
iex> %{users: Enum.into([name: "rockerboo"], HashDict.new)}
%{users: #HashDict<[name: "rockerboo"]>}
以上按预期工作。
Paweł 的回答是正确的。另一种选择是 "massage" doctest 中的数据。例如,这会起作用:
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 部分以包括他和我的示例:https://github.com/elixir-lang/elixir/blob/64e5f4876007d840edee3040c43e8f98095b8e3d/lib/ex_unit/lib/ex_unit/doc_test.ex#L77