ExUnit - как передать контекст для проверки макросов в описывающих блоках с помощью именованных функций установки - PullRequest
0 голосов
/ 05 сентября 2018

Глядя на документацию ExUnit, вы можете добавить свойства в структуру context по следующей схеме:

defmodule KVTest do
  use ExUnit.Case

  setup do
    {:ok, pid} = KV.start_link
    {:ok, pid: pid}
    # "[pid: pid]" also appears to work...
  end

  test "stores key-value pairs", context do
    assert KV.put(context[:pid], :hello, :world) == :ok
    assert KV.get(context[:pid], :hello) == :world

    # "context.pid" also appears to work...
  end
end

Но при использовании макроблоков describe рекомендуется использовать следующую форму для обеспечения функций настройки для ваших тестов:

defmodule UserManagementTest do
  use ExUnit.Case, async: true

  describe "when user is logged in and is an admin" do
    setup [:log_user_in, :set_type_to_admin]

    test ...
  end

  describe "when user is logged in and is a manager" do
    setup [:log_user_in, :set_type_to_manager]

    test ...
  end

  defp log_user_in(context) do
    # ...
  end
end

Это хорошо работает, но нет упоминания о том, как добавить новые свойства в структуру контекста для использования в тестах, при использовании макроса describe и именованных настроек.

Пока что я пробовал (краткое резюме):

  ...
  describe "when user is logged in and is a manager" do
    setup [:test]

    test(context) do
       IO.puts("#{ inspect context }") # Comes up as 'nil'
    end
  end

  defp test(context) do
    [test: "HALLO"]
  end
  ...

Действительно ли возможно манипулировать контекстом набора тестов при создании функций настройки для блоков описания таким образом?

1 Ответ

0 голосов
/ 05 сентября 2018

Вы правильно делаете настройку. Названные функции установки принимают контекст в качестве параметра, и их возвращение автоматически объединяется с контекстом. Таким образом, для ваших тестов у вас уже есть ключ :test.

Вам просто нужно получить контекст в ваших тестах как второй аргумент, например:

describe "when user is logged in and is a manager" do
  setup [:test]

  test "does the right thing", context do
     IO.inspect(context) # Will not come up as nil
  end
end

Но, что более интересно, вы можете использовать сопоставление с образцом, чтобы получить точные ключи, которые вы хотите из контекста:

describe "when user is logged in and is a manager" do
  setup [:test]

  test "does the right thing", %{test: test} do
     IO.inspect(test) # "HALLO"
  end
end
...