Как я могу использовать 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?


person jonleighton    schedule 23.05.2019    source источник


Ответы (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
person jonleighton    schedule 23.05.2019