有没有办法在doctests中使用模块别名?我不想每次都输入一个长名字。
defmodule SomeLongModuleName.SubModule do
alias SomeLongModuleName.SubModule, as: SubModule
@doc """
iex> SubModule.method(%{property_a: 1, property_b: 2) # CompileError
3
"""
def method(%{property_a: a, property_b: b) do
a + b
end
end
上面的示例显示了我可能希望使用别名来避免长行的情况。是否可以在doctest中使用别名?
答案 0 :(得分:14)
我可以想到两种方法,一次又一次不必输入模块名称。
在文档中使用插值并使用别名:
defmodule SomeLongModuleName.SubModule do
alias SomeLongModuleName.SubModule, as: SubModule
@doc """
iex> #{SubModule}.method(%{property_a: 1, property_b: 2})
3
"""
def method(%{property_a: a, property_b: b}) do
a + b
end
end
只使用不带模块的功能名称,并在通过测试doctest
的电话中添加import: true
:
defmodule SomeLongModuleName.SubModule do
@doc """
iex> method(%{property_a: 1, property_b: 2})
3
"""
def method(%{property_a: a, property_b: b}) do
a + b
end
end
doctest SomeLongModuleName.SubModule, import: true
答案 1 :(得分:2)
基于lab419和dylanthepiguy的回答:
带doctest的模块:
defmodule SomeLongModuleName.SubModule do
@doc """
iex> SubModule.add(x, y)
3
"""
def add(x, y) do
x + y
end
end
带有doctest的模块的测试用例:
defmodule SomeLongModuleName.SubModuleTest do
use ExUnit.Case, async: true
# Alias the submodule so we don't have to use the fully qualified name
alias SomeLongModuleName.SubModule
doctest SomeLongModuleName.SubModule, import: true
end
答案 2 :(得分:1)
事实证明,您可以在测试之前添加alias SomeLongModuleName.SubModule, as: SubModule
行。
更好的解决方案是不要在文档中放置太多测试,也不要使用别名。然后,在您的测试文件中,您可以将alias SomeLongModuleName.SubModule, as: SubModule
保存。
答案 3 :(得分:1)
正如dylanthepiguy所提到的,在doctest
行之前将别名放入测试文件中绝对是一个更好的解决方案。
检测代码进行测试是恕我直言的代码味道。
另请注意,as: Submodule
是默认值,因此不需要。
答案 4 :(得分:0)
不完全是您所要求的,而是一种相对干净的方法,无论您如何调用 doctest
(不依赖于 import
并且之间没有冲突)导入的和现有的函数) - 在 doctest 本身中为模块别名。
defmodule Some.Long.Module.Chain.Foo
@doc """
iex> alias Some.Long.Module.Chain.Foo
iex> Foo.bar(1)
"one"
iex> Foo.bar(2)
"two"
"""
def bar(i) do
# ...
end
end