Elixir - 如何在doctest中使用别名?

时间:2017-04-05 22:04:43

标签: testing elixir

有没有办法在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中使用别名?

5 个答案:

答案 0 :(得分:14)

我可以想到两种方法,一次又一次不必输入模块名称。

  1. 在文档中使用插值并使用别名:

    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
    
  2. 只使用不带模块的功能名称,并在通过测试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