Разница между "именованным контекстом" и "тегами" в ExUnit
В ExUnit есть только один уровень вложенности для организации тестов. Я пришел из Ruby on Rails и часто использовал RSpec, поэтому я привык к большему количеству уровней вложенности. Кроме того, ESpec для эликсира позволяет больше уровней вложенности.
В ExUnit я видел как теги, так и именованные контексты, используемые для этого. Помимо синтаксиса, каковы основные различия между двумя подходами?
Пример с тегами:
defmodule TagsTest do
use ExUnit.Case
setup context do
user = case context[:login] do
"internal" -> "internal_user"
"customer" -> "customer_user"
_ -> "unknown"
end
{:ok, %{user: user}}
end
@tag login: "internal"
test "login as internal", %{user: user} do
assert user == "internal_user"
end
@tag login: "customer"
test "login as customer", %{user: user} do
assert user == "customer_user"
end
end
@tag login: "customer"
test "login as customer", %{user: user} do
assert user == "customer"
end
end
Пример с именованными контекстами:
defmodule NestedContextTest do
use ExUnit.Case
describe "outside" do
setup [:outside, :independent]
test "takes the outside value", context do
assert context[:a] == "outside"
end
test "takes the independent value", context do
assert context[:b] == "independent"
end
end
describe "inside" do
setup [:inside, :independent]
test "takes the inside value", context do
assert context[:a] == "inside"
end
test "takes the independent value", context do
assert context[:b] == "independent"
end
end
defp outside(_) do
%{a: "outside"}
end
defp inside(_) do
%{a: "inside"}
end
defp independent(_) do
%{b: "independent"}
end
end