【问题标题】:Writing doctests when a struct is returned返回结构时编写文档测试
【发布时间】:2018-08-17 19:42:45
【问题描述】:

类似问题的答案是this question

要使用 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

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: ... 会有所不同,这意味着测试将始终失败。

有什么可以做的,甚至有什么解决方法吗?

【问题讨论】:

    标签: elixir ex-unit


    【解决方案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
    

    您要显示的值是特定于测试的,对于应该阅读文档的任何人来说都是非常误导的。

    【讨论】:

    • 是什么让文档产生误导性阅读?我正在展示该功能的工作原理。
    • 所有这些id=4 等都是实现细节,应该在它们所属的地方描述。为了展示它是如何工作的,上面的代码已经足够了:它表明它返回了 {:ok, %Setting{}} 元组,并为结构的相应键分配了一个新值。
    • 例如,显示name: "Display Breadcrumb" 是一种误导。我很困惑:它是硬编码的吗?它是从哪里来的?它是默认值吗?为什么?!
    • 这只是一个随机数据库,里面有一些我可以预料到的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多