elixir - 返回结构时编写文档测试
问题描述
类似问题的答案有这个问题。
为了使用 doctest 测试函数,您必须能够预测函数的输出。
问题
正如标题中提到的,我想坚持使用 doctest,但这似乎不起作用,我不相信没有办法做到这一点。
代码
@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(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: ...
将有所不同,这意味着测试将始终失败。
有什么可以做的,甚至有什么解决方法吗?
解决方案
您应该将文档放在%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
您要显示的值是特定于测试的,对于应该阅读文档的任何人来说都是非常误导的。
推荐阅读
- python - 查找字符串中两边只有一个括号的所有子字符串
- angular - Angular:为什么 package-lock.json 在新的 npm 安装后具有比 package.json 更高版本的包?
- python - 在 Python 中使用归并排序/快速排序对类对象的属性进行排序
- r - geom_col 中是否可以有可变宽度的条形?
- mongodb - 仅使用一个文档自动创建 mongodb 集合?
- python - 在 aws 胶水中运行的 pandas_udf 函数不会在没有打印功能的情况下将对象放入 s3
- javascript - 如何递归地反转链表?
- python - 如何一次运行两个 Python 脚本?
- linux - /dev/input/eventX 和 /dev/input/jsX 有什么区别?
- python - 使用相关热图显示带有 seaborn 的产品价格