2015-11-12 2 views
3

Каков правильный способ запуска тестов для доступа к нескольким базам данных?Как протестировать приложение с несколькими базами данных Elixir (Phoenix, Ecto)

Я пишу крошечный API, который должен иметь доступ к нескольким базам данных.

я определил 2 Repos каждый оберточной другую базу данных:

# config/dev.exs, config/test.exs, ... 
config :my_app, MyApp.DbStatusRepo, 
    adapter: Ecto.Adapters.Postgres, 
    .... 

config :my_app, MyApp.DbDefinitionRepo, 
    adapter: Ecto.Adapters.Postgres, 
    ... 

# lib/my_app/db_status_repo.ex 
defmodule MyApp.DbStatusRepo do 
    use Ecto.Repo, otp_app: :my_app 
end 

# lib/my_app/db_definition_repo.ex 
defmodule MyApp.DbDefinitionRepo do 
    use Ecto.Repo, otp_app: :my_app 
end 

Это работает при запуске сервера, но я не могу найти способ, чтобы запустить свои тесты без них ожидает параметр по умолчанию MyApp.Repo.

Я обновил (и добавил) псевдонимы для обоих РЕПО.

Я изменил все ссылки на Repo, но я уверен, что он не работает до запуска моего набора тестов.

Запуск тестовый набор дает следующее сообщение об ошибке:

(Mix) не удалось загрузить SourcesApi.Repo, ошибка:: nofile. Просьба передать надлежащее репо с опцией -r.

Передача другого репо с опцией -r ничего не меняет. Такая же ошибка.

Мои Env:

  • Elixir: 1.1.1
  • Phoenix: 1.0.3
  • Ecto: 1.0.6

Спасибо за вашу помощь.

ответ

1

Во-первых, вам нужно начать репо в lib/my_app.ex

# Start the Ecto repository 
worker(MyApp.DbStatusRepo, []), 
worker(MyApp.DbDefinitionRepo, []), 

Далее готовят репо в test/test_helper.exs

Mix.Task.run "ecto.create", ["--quiet", "-r", "MyApp.DbDefinitionRepo"] 
Mix.Task.run "ecto.migrate", ["--quiet", "-r", "MyApp.DbDefinitionRepo"] 
Ecto.Adapters.SQL.begin_test_transaction(MyApp.DbDefinitionRepo) 
+0

Спасибо большое. Я полностью пропустил то, что на самом деле выполнял тестовый помощник. Я добавил действия create & migrate для обоих репозиториев. Еще раз спасибо. –

+1

На всякий случай кто-то наткнется на этот ответ, 'Mix.Task.run' прервет и вернет': noop', если одна и та же команда запускается более одного раза, независимо от аргументов. Если вы хотите сделать что-то подобное, вам нужно запустить 'Mix.Task.reenable (task)' для обеих задач, прежде чем запускать их для второго репо. –

0

MyApp.Repo является совмещенным в test/support/conn_case.ex поэтому вы можете позвонить Repo.get(...):

using do 
    quote do 
     # Import conveniences for testing with connections 
     use Phoenix.ConnTest 

     alias MyApp.Repo 
     ... 
    end 
    end 

    setup tags do 
    unless tags[:async] do 
     Ecto.Adapters.SQL.restart_test_transaction(MyApp.Repo, []) 
    end 

    :ok 
    end 

Вам нужно будет обновить это псевдоним одного из репозиториев, которые вы указали. Однако, если у вас есть два репозитория, которые вы используете для разных целей, тогда вы должны явно использовать MyApp.DbStatusRepo.get(...) и MyApp.DbDefinitionRepo.get(...), когда каждый из них имеет значение.

+0

Спасибо за ответ. Я не был слишком ясен в своем вопросе, что я уже обновил/добавил псевдонимы. Моя проблема была полностью вызвана задачами создания и миграции, заданными в test_helper.exs, как описано Kabie. –

Смежные вопросы