ExUnit вызывает пустую ошибку с блоком setup_all

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

Поэтому я пытаюсь настроить эти данные с помощью обратного вызова setup_all, поскольку эти данные можно настроить один раз.

Поскольку я не хочу ничего присваивать контексту, я определил setup_all, как показано ниже.

setup_all do
  create_languages() 
  create_regions()
  create_currencies() 
  create_user()
  :ok
end

И у каждого теста есть функция, которая получает одну структуру из созданных данных.

Например, один из тестов выглядит следующим образом:

test "update_core/2 (region_id) with valid data, updates core" do
  region = get_region()
  core = create_core()

  {:ok, core} = Cores.update_core(core, %{region_id: region.id})

  assert region.id == core.region_id
end

Однако region = get_region() вызывает пустую ошибку. Почему эта функция может получить структуру? IO.inspect показывает, что create_regions() фактически создает несколько регионов. Я что-то упустил здесь?

Заранее спасибо.


person D.R    schedule 26.10.2018    source источник


Ответы (1)


Есть большая вероятность, что Ecto либо настроен для использования в режиме песочницы, либо настроен на сброс базы данных после каждого теста в вашей среде :test. Поэтому вы должны использовать блок setup вместо setup_all:

setup do
  create_languages() 
  create_regions()
  create_currencies() 
  create_user()
  :ok
end

Блок setup вызывается перед каждым тестом, а setup_all вызывается только один раз.

person Sheharyar    schedule 26.10.2018
comment
Причина, по которой я хочу использовать setup_all, а не setup, заключается в том, что, поскольку setup вызывает каждый отдельный тест, это занимает много времени... - person D.R; 26.10.2018
comment
Да, но это правильный путь, чтобы разные тесты не мешали друг другу. Чтобы ускорить тесты, вы можете убедиться, что Ecto действительно настроен в режиме песочницы, и запускать их одновременно, установив для тега async значение true. - person Sheharyar; 26.10.2018