3

我希望能够在 Elixir中对协议实现进行doctest 。

这是一些示例代码:

defprotocol Size do
  def size(data)
end

defmodule Foo do
  defstruct []

  defimpl Size do
    @doc """

    ## Examples

        iex> Size.size(%Foo{})
        0
    """
    def size(foo) do
      0
    end
  end
end

此测试代码不起作用(因为它只能找到Foo模块中定义的函数,在 之外defimpl):

ExUnit.start()

defmodule FooTest do
  use ExUnit.Case
  doctest Foo
end

如何测试defimpl块?

4

1 回答 1

4

事实证明,它defimpl在幕后定义了一个模块。这可以通过impl_for协议上的函数找到:

iex(1)> Size.impl_for(%Foo{})
Size.Foo

所以我们可以像这样对这个模块进行doctest:

defmodule FooTest do
  use ExUnit.Case
  doctest Foo
  doctest Size.Foo
end

请注意,如果SizeFoo都在同一个模块中(例如MyModule),则模块名称必须指定两次:

defmodule FooTest do
  use ExUnit.Case
  doctest MyModule.Foo
  doctest MyModule.Size.MyModule.Foo
end
于 2019-05-23T04:56:26.063 回答