在doctest中测试HashSet

时间:2015-06-26 20:43:01

标签: testing hashset elixir 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...

3 个答案:

答案 0 :(得分:5)

您可以用不同的方式构建HashSet,使其成为有效的Elixir表达式。例如,这对我有用:

## Examples
  iex> Elirc.Channel.add_user_to_state("rockerboo", %{users: HashSet.new})
  %{users: ["rockerboo"] |> Enum.into(HashSet.new)}

这也是ExUnit.DocTest documentation&#34;不透明类型&#34;

推荐的方法

答案 1 :(得分:4)

Paweł的回答是正确的。另一种方法是“按摩”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

答案 2 :(得分:1)

那么你的问题是你试图代表一些不可能的东西,一个没有键或没有值的HashDict条目。 HashDict.put(state.users, "rockerboo")会失败,因为put需要3个参数,一个HashDict,一个键和一个值。假设你有类似name: "rockerboo"的东西:

iex> %{users: Enum.into([name: "rockerboo"], HashDict.new)} %{users: #HashDict<[name: "rockerboo"]>}

以上工作符合预期。