2017-04-05 98 views
6

有没有办法在doctests中使用模块别名?我不想每次都输入一个长名字。Elixir - 如何在doctest中使用别名?

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

我假设文档测试从全球运行命名空间,所以它将无法看到别名。 – Dylanthepiguy

回答

11

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

  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

不错!第一个选项看起来像一个(相当整洁的)黑客,第二个选项看起来就像它是为这种情况准备的。也许切换顺序? – Dylanthepiguy

+0

选项2像一个魅力工作:)谢谢。 – PlagueHammer

1

事实证明,您可以在测试之前放置一条alias SomeLongModuleName.SubModule, as: SubModule行。

更好的解决方案是不要在文档中放置太多测试,也不要使用别名。然后,在您的测试文件中,您可以将alias SomeLongModuleName.SubModule, as: SubModule保存。

1

正如dylanthepiguy所提到的,将别名放入测试文件中,在doctest行之前,绝对是一个更好的解决方案。

为您的代码进行测试是恕我直言,代码味道。

另请注意,as: Submodule是默认值,因此不需要。

1

大厦从lab419和dylanthepiguy答案:

模块与文档测试:

defmodule SomeLongModuleName.SubModule do 
    @doc """ 
     iex> SubModule.add(x, y) 
     3 
    """ 
    def add(x, y) do 
    x + y 
    end 
end 

测试用例模块,文档测试:

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