2016-04-22 12 views
3

Wie Sie wissen, unterstützt rspeclet in seinen Tests. Es ist ziemlich hilfreich und kurze Codes codieren, indem Sie allgemeine Variablen vordefinieren und sie zwischen den Tests teilen.Analog von `let` in ExUnit

Wie kann ich diese Funktionalität in ExUnit aufrufen?

Antwort

6

Ich denke, der bessere Weg, um das gleiche Verhalten auf Elixir mit ExUnit zu haben, ist setup_all oder setup.

Die Callbacks setup_all werden einmal aufgerufen, um den Testfall einzurichten, bevor ein Test ausgeführt wird und alle Setup-Callbacks vor jedem Test ausgeführt werden. Kein Callback wird ausgeführt, wenn der Testfall keine Tests enthält oder alle Tests herausgefiltert wurden.

vollständige Dokumentation finden Sie hier: http://elixir-lang.org/docs/stable/ex_unit/ExUnit.Callbacks.html

+0

Wenn Sie Testfälle "verfassen", werden auch die in den "Vorfahren" -Fällen definierten "Setup" -Fälle aufgerufen. Schauen Sie sich an, wie der Standard 'ConnCase' von Phoenix definiert wird, um zu sehen, was ich meine. Damit können Sie erreichen, was wir in 'rspec' erhalten, indem wir' lets' und Context-Blöcke verschachteln. –

3

denke ich, ein guter Weg, um diesen Ansatz ist, das Zeug vorausgesetzt, Sie mit let ist dynamisch, hat eine private Funktion in Ihrem Testfall, der den Wert berechnet Sie benötigen binden würden.

defmodule MyModuleTest do 
    use ExUnit.Case 

    test "timestamp is a tuple" do 
    assert is_tuple(my_var()) 
    end 

    defp my_var() do 
    :os.timestamp() 
    end 
end 

RSpec des let gibt Ihnen auch das Caching des Wertes es berechnet; Sie könnten dies durch die Verwendung der process dictionary tun, aber das ist in der Regel abgeraten. sehr leicht erreichbar in dem Test in einer Variablen nur durch Speicher das Ergebnis in jedem Fall ist diese gecached mit:

test "timestamp is a tuple" do 
    my_var = my_var() 
    assert is_tuple(my_var) 
    # other stuff that uses my_var 
end 

Es ist etwas ausführlicher, aber enorm weniger „Magie“ und explizit :).

+1

Btw, ja Rückkehr einen Kontext von 'setup' ist wahrscheinlich eine gemeinsame Sache zu tun, wie Paweł :) – whatyouhide

+0

+1 zeigte. Ich erstelle normalerweise nur private Funktionen, um einige Standardaktionen zu abstrahieren, und bevorzuge Setup und Kontext beim Erstellen von Testdaten. –

4

Ich denke, die am nächsten analogen einen Kontext von einem Setup-Haken zurückkehrt. Werfen Sie einen Blick auf diese angepasst Beispiel von the ExUnit.Callbacks documentation:

defmodule AssertionTest do 
    use ExUnit.Case, async: true 

    setup do 
    {:ok, hello: "world"} 
    end 

    test "a test", context do 
    assert(context[:hello] == "world") 
    end 
end 
+4

Es ist auch üblich, Übereinstimmungen in einem Kontext wie diesem zu finden: 'test" ein test ",% {hallo: hallo } do ... 'Die 'Hallo' Variable wird' "Welt" -Wert haben. – tkowal