如何在Elixir的doctest中进行字符串插值?

时间:2018-01-12 02:46:32

标签: testing elixir

我一直在努力尝试Elixir中的doctests,直到我尝试进行字符串插值,它一直很好。

以下是代码:

  @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时出现此错误:

  

变量&#34;用户&#34;不存在并且正在扩展到&#34; user()&#34;,请使用括号删除歧义或更改变量名称

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

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

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

1 个答案:

答案 0 :(得分:1)

发布修改后(见上文),我发现解决方案是使用@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