Написание документов для тестирования, когда структура возвращается

Ответ на подобный вопрос имеет этот вопрос.

Чтобы протестировать функцию с помощью doctests, вы должны быть в состоянии предсказать вывод вашей функции.

вопрос

Как упомянуто в названии, я хотел бы использовать doctests, но это, похоже, не работает, и я не верю, что нет способа сделать это.

Код

  @doc """
  Update a field(s) in a setting record

  ## Examples

      iex> example = Setting.get(id: 4)
      iex> Setting.update(example, %{keyname: "an_example"})
      {:ok, %Elements.Setting{_}}


  """
  @spec update(struct :: Elements.Setting, changes :: map()) :: {:ok, Ecto.Schema} | {:error, Ecto.Changeset.t()}
  def update(struct, changes) do
    ...
  end

Выше приведен код, который я пробовал, и его варианты. Такие как использование _ где данные будут неожиданными. Только биты, которые не изменились бы.

Например, в идеале я хотел бы, чтобы возвращаемое значение было похоже на {:ok, %Elements.Setting{keyname: "an_example", _}, Таким образом, документация проходит, но она также разборчива для пользователей в том, что они читают, и может видеть влияние кода, который был до этого.

IEX

iex(6)> Setting.update(example, %{keyname: "an_example"})
{:ok,
 %Elements.Setting{
   __meta__: #Ecto.Schema.Metadata<:loaded, "settings">,
   children: #Ecto.Association.NotLoaded<association :children is not loaded>,
   id: 4,
   inserted_at: ~N[2018-08-17 07:53:23.000000],
   keyname: "an_example",
   name: "Display Breadcrumb",
   parent: #Ecto.Association.NotLoaded<association :parent is not loaded>,
   parent_id: 2,
   updated_at: ~N[2018-08-17 10:29:46.707878]
 }}

Основываясь на цитируемом ответе в начале, вы можете заметить, что, по крайней мере, inserted_at: ... а также updated_at: ... будут другими, то есть тест всегда будет неудачным.

Есть ли что-нибудь, что может быть сделано или даже какой-нибудь обходной путь?

1 ответ

Вы должны положить документацию о том, что %Elements.Setting{} находится там, где он принадлежит (модуль, который определяет эту структуру) и придерживается соответствия тому, что вы только что явно установили:

iex> example = Setting.get(id: 4)
iex> with {:ok, %Setting{} = result} <- Setting.update(example, %{keyname: "an_example"}),
...>   do: result.keyname == "an_example"
true

Значения, которые вы хотите показать, относятся к конкретному тесту и вводят в заблуждение любого, кто должен читать документацию.

Другие вопросы по тегам