我希望能够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
块?
答案 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
请注意,如果Size
和Foo
都在同一个模块中(例如MyModule
),则模块名称必须指定两次:
defmodule FooTest do
use ExUnit.Case
doctest MyModule.Foo
doctest MyModule.Size.MyModule.Foo
end