2016-04-22 13 views
3

ご存じのように、rspecは、そのテストでletをサポートしています。それは非常に有用であり、短所は共通変数をあらかじめ定義してそれらをテスト間で共有することによって多くのコードを作成します。ExUnitの「let」のアナログ

ExUnitでこの機能を呼び出すにはどうすればよいですか?

答えて

6

ExUnitでElixirで同じ動作をするより良い方法は、setup_allまたはsetupを使用していると思います。

setup_allコールバックは、テストが実行される前にテストケースを設定するために一度呼び出され、各テストの前にすべてのセットアップコールバックが実行されます。テストケースにテストがない場合、またはすべてのテストが除外された場合は、コールバックは実行されません。

完全なドキュメントは、ここで見つけることができます:http://elixir-lang.org/docs/stable/ex_unit/ExUnit.Callbacks.html

+0

また、テストケースを "構成"するとき、 "祖先"ケースで定義された 'setup'ケースも呼び出されます。デフォルトの 'ConnCase'がphoenixによってどのように定義されているのか見てみましょう。これを使って、 'rspec'で' lets 'とコンテキストブロックを入れ子にすることで、「並べ替える」ことができます –

3

これは、と結びついているものをletとすると、という動的なもので、必要な値を計算する専用の関数をテストケースに含めることができます。

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のletは、計算する値のキャッシングを提供します。 process dictionaryの使用によってこれを行うことができますが、それは通常はお勧めしません。いずれにせよ、このキャッシュさを持つことは単なるテストの内部変数に結果を格納することにより、非常に簡単に達成可能である:

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

それは少し冗長だが非常以下「魔法」と、より明示的な:)。

+1

ところで、ええsetup' 'からコンテキストを返すことは、おそらくパヴェルは:) – whatyouhide

+0

+1を示したとして行うには、より一般的なものです。私は通常、いくつかの定型的な "アクション"を抽象化するプライベート関数を作成し、テストデータを作成するときはセットアップとコンテキストを優先します。 –

4

私は最も近いアナログがセットアップフックからコンテキストを返していると思います。 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

このような文脈でパターンマッチするのも普通です: 'test" a test "、%{hello:hello } do ... '' hello'変数は '' world ''の値を持ちます。 – tkowal

関連する問題