2016-06-27 1 views
1

ですから、例えば、私が持っている:doctestの間にエラータイプのみを照合する方法はありますか?

@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が、ないメッセージの内容自体を上げてテストしたいと思います。

答えて

3

現在、直接的な方法はありません。 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