我一直在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