Проблема с интеграционным тестированием веб-приложения в зонтике

Я работаю над приложением phoenix. Это приложение является частью зонтичного приложения. В этом зонтике у меня есть небольшие приложения, отвечающие за разные области приложения, а именно:

  • Феникс веб-API ("API")
  • основная бизнес-логика («ядро»)
  • аутентификация пользователя («авторизация»)
  • схема базы данных ("db")

«api» зависит как от «core», так и от «auth», в то время как эти два приложения зависят от «db».

Только приложение «db» имеет экто-репозиторий, а все остальные приложения — нет. Репо запускается приложением "db" и контролируется.

Теперь я хочу протестировать свои контроллеры в приложении «api». Вот тут у меня возникла проблема с экто. Когда я тестирую действие контроллера, это действие вызывает функцию из "auth" или "core", которая вызывает функции Repo из "db" (например, Repo.insert/2). Это приводит к OwnershipError:

** (DBConnection.OwnershipError) cannot find ownership process for #PID<0.458.0>.

When using ownership, you must manage connections in one                         
of the three ways:                                                               

  * By explicitly checking out a connection                                      
  * By explicitly allowing a spawned process                                     
  * By running the pool in shared mode                                           

The first two options require every new process to explicitly                    
check a connection out or be allowed by calling checkout or                      
allow respectively.                                                              

The third option requires a {:shared, pid} mode to be set.                       
If using shared mode in tests, make sure your tests are not                      
async.                                                                           

If you are reading this error, it means you have not done one                    
of the steps above or that the owner process has crashed.                        

See Ecto.Adapters.SQL.Sandbox docs for more information.                         

Теперь моя проблема заключается в том, что я не знаю, как исправить эту ошибку, используя предложенные решения в тестах «api», поскольку приложение «api» не знает приложение «db» и поэтому не может выполнить проверку подключения. Когда я столкнулся с этой ошибкой в ​​​​приложении, которое напрямую зависело от проекта «db», я смог применить решение «общий режим».

Мой вопрос будет заключаться в том, как я могу решить проблему владения с помощью моих интеграционных тестов «api».


person Thorakas    schedule 26.11.2016    source источник


Ответы (1)


Вот несколько предостережений при запуске тестов в режиме зонтика (как описано в сообщениях об ошибках).

  1. Ваши зависимые репозитории должны быть «проверены»
  2. Ваши зависимые репозитории могут никогда не запускаться
  3. Ваши зависимые репозитории могут не работать в «общем» режиме.

Оттуда, возможно, ваш test_helper.exs может выглядеть так (псевдокод):

ExUnit.start

Db.Repo.start_link()
Core.Repo.start_link()
Auth.Repo.start_link()

Ecto.Adapters.SQL.Sandbox.checkout(Db.Repo)
Ecto.Adapters.SQL.Sandbox.checkout(Core.Repo)
Ecto.Adapters.SQL.Sandbox.checkout(Auth.Repo)

Ecto.Adapters.SQL.Sandbox.mode(Api.Repo, :manual)
Ecto.Adapters.SQL.Sandbox.mode(Db.Repo, :shared)
Ecto.Adapters.SQL.Sandbox.mode(Core.Repo, :shared)
Ecto.Adapters.SQL.Sandbox.mode(Auth.Repo, :shared)

Обновление:

Не забудьте указать путь к проекту БД в mix.exs

defp deps do
   [
      ...
      {:db, path: "path/to/db"},
      ...
   ]
end
person ardhitama    schedule 27.11.2016
comment
Спасибо за ваш ответ. Некоторые мысли по этому поводу: (1) Существует только одно репо, приложение db. Репо контролируется и должно запускаться при запуске приложения БД. (2) Когда я пишу тест для API, приложение API не знает, что существует экто-репозиторий, поскольку API не имеет прямой зависимости от БД. Именно по этой причине я не знаю, как проверить репозиторий в тестах приложений. Я включаю это в свой вопрос - person Thorakas; 28.11.2016
comment
@Thorakas, мой ответ остается в силе, в тестах должно быть запущено другое приложение otp. Не уверен, находитесь ли вы в асинхронном режиме или нет - person ardhitama; 28.11.2016
comment
Эти тесты не выполняются в асинхронном режиме. Я также настроил проект API так, чтобы он требовал запуска ядра и аутентификации, которые сами по себе требуют запуска БД. Как я уже говорил ранее, я не знаю, как применить ваш ответ к моей ситуации. Я не могу проверить Db.Repo, так как этот модуль не известен в проекте API. - person Thorakas; 29.11.2016
comment
Ответ @Thorakas обновлен с добавлением зависимости Db - person ardhitama; 30.11.2016