如何使用Elixir的doctest测试协议实现?

时间:2019-05-23 04:56:26

标签: elixir ex-unit

我希望能够doctest在Elixir中实现protocol实现

这是一些示例代码:

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块?

1 个答案:

答案 0 :(得分:1)

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

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

所以我们可以像这样对这个模块进行文档测试:

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