ご存じのように、rspec
は、そのテストでlet
をサポートしています。それは非常に有用であり、短所は共通変数をあらかじめ定義してそれらをテスト間で共有することによって多くのコードを作成します。ExUnitの「let」のアナログ
ExUnit
でこの機能を呼び出すにはどうすればよいですか?
ご存じのように、rspec
は、そのテストでlet
をサポートしています。それは非常に有用であり、短所は共通変数をあらかじめ定義してそれらをテスト間で共有することによって多くのコードを作成します。ExUnitの「let」のアナログ
ExUnit
でこの機能を呼び出すにはどうすればよいですか?
ExUnitでElixirで同じ動作をするより良い方法は、setup_all
またはsetup
を使用していると思います。
setup_allコールバックは、テストが実行される前にテストケースを設定するために一度呼び出され、各テストの前にすべてのセットアップコールバックが実行されます。テストケースにテストがない場合、またはすべてのテストが除外された場合は、コールバックは実行されません。
完全なドキュメントは、ここで見つけることができます:http://elixir-lang.org/docs/stable/ex_unit/ExUnit.Callbacks.html
これは、と結びついているものを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
それは少し冗長だが非常以下「魔法」と、より明示的な:)。
ところで、ええsetup' 'からコンテキストを返すことは、おそらくパヴェルは:) – whatyouhide
+1を示したとして行うには、より一般的なものです。私は通常、いくつかの定型的な "アクション"を抽象化するプライベート関数を作成し、テストデータを作成するときはセットアップとコンテキストを優先します。 –
私は最も近いアナログがセットアップフックからコンテキストを返していると思います。 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
このような文脈でパターンマッチするのも普通です: 'test" a test "、%{hello:hello } do ... '' hello'変数は '' world ''の値を持ちます。 – tkowal
また、テストケースを "構成"するとき、 "祖先"ケースで定義された 'setup'ケースも呼び出されます。デフォルトの 'ConnCase'がphoenixによってどのように定義されているのか見てみましょう。これを使って、 'rspec'で' lets 'とコンテキストブロックを入れ子にすることで、「並べ替える」ことができます –