Написание документов для тестирования, когда структура возвращается
Ответ на подобный вопрос имеет этот вопрос.
Чтобы протестировать функцию с помощью 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
Значения, которые вы хотите показать, относятся к конкретному тесту и вводят в заблуждение любого, кто должен читать документацию.