Как я могу использовать doctest Elixir для тестирования реализации протокола? - PullRequest
1 голос
/ 23 мая 2019

Я хочу иметь возможность doctest реализация протокола в Elixir.

Вот пример кода:

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 Ответ

1 голос
/ 23 мая 2019

Оказывается, 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
...