我一直在努力尝试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的上下文中查看是否有另一种方法进行字符串插值。
答案 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执行字符串插值。