Разница между "именованным контекстом" и "тегами" в 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

0 ответов

Другие вопросы по тегам