有没有办法在doctest期间只匹配错误类型?

时间:2016-06-27 16:38:23

标签: elixir

所以,例如,我有:

  @doc ~S"""
  Fails on more than 6 elements:

      iex> values = [1,2,3,4,5,6,7]
      ...> Units.ProjectedValues.new(values)
      ** (FunctionClauseError) no function clause matching in Units.ProjectedValues.new/1
  """

但是,我只想测试FunctionClauseError是否被引发,而不是消息内容本身。

1 个答案:

答案 0 :(得分:4)

现在没有任何直接的方法。如果您不提供任何消息,parser会创建一个空字符串作为消息,并且似乎没有任何检查将空消息(或任何其他消息,如"...")视为匹配所有。

如果你需要在doctest中多次这样做,并且真的不想写完整的消息,你可以使用如下的帮助宏:

defmodule M do
  @doc ~S"""
      iex> M.sum([1, 2, 3])
      6
      iex> M.rescue_struct M.sum({1, 2, 3})
      FunctionClauseError
  """
  def sum([]), do: 0
  def sum([x | xs]), do: x + sum(xs)

  defmacro rescue_struct(expr) do
    quote do
      try do
        unquote(expr)
        raise "expected an error to be raised"
      rescue
        e -> e.__struct__
      end
    end
  end
end