2017-04-05 1 views
6

Gibt es eine Möglichkeit, einen Modul-Alias ​​in den Doctests zu verwenden? Ich möchte nicht jedes Mal einen langen Namen eingeben müssen.Elixier - Wie können Sie einen Alias ​​in doctest verwenden?

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 

Das obige Beispiel zeigt eine Situation, in der ich den Alias ​​verwenden möchte, um lange Zeilen zu vermeiden. Ist es überhaupt möglich, einen Alias ​​in einem Doctest zu verwenden?

+0

Ich gehe davon aus, dass die Doctests von der globalen laufen Namespace, so dass es die Aliase nicht sehen kann. – Dylanthepiguy

Antwort

11

Es gibt zwei Möglichkeiten, um den Modulnamen nicht immer wieder eingeben zu müssen.

  1. Verwenden Interpolation in Ihren Dokumenten und verwenden Sie den Alias-Namen:

    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. Verwenden nur den Funktionsname ohne Modul und in Ihrem Anruf doctest aus Ihren Tests, fügt 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

Schön! Die erste Option sieht wie ein (ziemlich sauberer) Hack aus und die zweite Option sieht so aus, als wäre sie genau für diesen Fall gemacht worden. Vielleicht die Reihenfolge wechseln? – Dylanthepiguy

+0

Option 2 funktionierte wie ein Charme :) Danke. – PlagueHammer

1

Es stellt sich heraus, dass Sie eine alias SomeLongModuleName.SubModule, as: SubModule Zeile direkt vor dem Test setzen können.

Eine bessere Lösung besteht darin, nicht zu viele Tests in die Dokumente zu schreiben und keinen Alias ​​zu verwenden. Dann können Sie in Ihrer Testdatei alias SomeLongModuleName.SubModule, as: SubModule speichern.

1

Wie von dylanthepiguy erwähnt, ist es definitiv eine bessere Lösung, die Aliase in das Testfile zu schreiben, kurz vor der doctest Zeile.

Instrumentierung Ihres Codes für Tests ist IMHO ein Code Geruch.

Beachten Sie auch, dass as: Submodule die Standardeinstellung und daher unnötig ist.

1

Aufbauend auf die Antwort von lab419 und dylanthepiguy:

Modul mit doctest:

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

Testfall für das Modul mit 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 
Verwandte Themen