我一直在Elixir中尝试doctest,在尝试进行字符串插值之前,它一直工作得很好。

这是代码:

  @doc"""
  Decodes the user resource from the sub claim in the received token for authentication.

  ## Examples

      iex> attrs = %{email: "test@example.com", password: "password", password_confirmation: "password"}
      iex> {:ok, user} = Accounts.create_user(attrs)
      iex> resource_from_claims(%{"sub" => "User:#{user.id}"})
      {:ok, %User{}}

  """
  def resource_from_claims(%{"sub" => "User:" <> id}) do
    resource = Accounts.get_user(id)
    case resource do
      nil -> {:error, :no_result}
      _ -> {:ok, resource}
    end
  end


运行mix test时出现此错误:


  变量“用户”不存在,并且正在扩展为“ user()”,请使用括号消除歧义或更改变量名称


我可以确认user变量确实存在并且可以在几乎所有其他变量上工作,除非我尝试将其放在字符串插值中。

还有另一种方法可以在doctests中进行字符串插值吗?

编辑:看来我正在收到此错误,因为@doc中的字符串插值部分实际上是在doctest范围之外运行的,而不是作为模块本身的一部分运行的。我将看看在doctest的上下文中是否还有另一种方法来进行字符串插值。

最佳答案

发布编辑内容(参见上文)后,我发现解决方案是使用@doc调用~S字符串:

  @doc ~S"""
  Decodes the user resource from the sub claim in the received token for authentication.

  ## Examples

      iex> attrs = %{email: "test@example.com", password: "password", password_confirmation: "password"}
      iex> {:ok, user} = Accounts.create_user(attrs)
      iex> resource_from_claims(%{"sub" => "User:#{user.id}"})
      {:ok, %User{}}

  """


这样,模块将忽略在@doc块内编写的任何字符串插值,这将使doctest代替执行字符串插值。

参考:https://github.com/elixir-lang/elixir/issues/2512

10-05 22:53
查看更多