Просто изучая doctests в Elixir, я пытаюсь написать doctest Elixir, чтобы убедиться, что структура будет содержать два пустых MapSet.
defstruct [:coordinates, :hit_coordinates]
@doc """
Creates a new Island structure
## Examples
iex> IslandsEngine.Island.new()
%IslandsEngine.Island { coordinates: #MapSet<[]>, hit_coordinates: #MapSet<[]> }
"""
def new(), do:
%Island{ coordinates: MapSet.new(), hit_coordinates: MapSet.new() }
Когда я запускаю это с помощью mix test, я получаю следующую ошибку:
Compiling 1 file (.ex)
1) doctest IslandsEngine.Island.new/0 (1) (IslandsEngine.IslandTest)
test/islands_engine/island_test.exs:3
Doctest did not compile, got: (TokenMissingError) lib/islands_engine/island.ex:19: missing terminator: } (for "{" starting at line 19)
code: %IslandsEngine.Island { coordinates: #MapSet<[]>, hit_coordinates: #MapSet<[]> }
stacktrace:
lib/islands_engine/island.ex:19: IslandsEngine.Island (module)
.......
Finished in 0.1 seconds
6 doctests, 2 tests, 1 failure
Тем не менее, все работает нормально в сеансе IEx:
iex> IslandsEngine.Island.new()
%IslandsEngine.Island{coordinates: #MapSet<[]>, hit_coordinates: #MapSet<[]>}
iex>
Спасибо за любую помощь!





Вам нужен код, конструирующий действительный ответ, а не текстовое представление в вашем doctest. Итак, вместо:
%IslandsEngine.Island{coordinates: #MapSet<[]>, hit_coordinates: #MapSet<[]>}
Делать:
%IslandsEngine.Island{coordinates: %MapSet{}, hit_coordinates: %MapSet{}}
Я предполагаю, что в этом случае пример не имеет большого значения как тест, потому что он просто копирует код, но он все еще может быть действителен в качестве документации.
Спасибо, Павел, ваше объяснение имеет смысл, и да, это действительно больше для примера документации, а также для простого регрессионного теста.