RSpec: как запустить тесты на другой базе данных - PullRequest
0 голосов
/ 27 июня 2018

Мне нужно перенести некоторые данные, и я хотел бы протестировать некоторые модели, которые используют другое соединение, т. Е. Отличное от определенного в database.yml develoment, test группах. Поэтому я добавил новое соединение с базой данных в database.yml:

default: &default
  adapter: postgresql
  encoding: unicode
  user: postgres
  password:
  pool: 5

development:
  <<: *default
  database: myapp_development
  host: <%= ENV['DATABASE_HOST'] %>

test:
  <<: *default
  database: myapp_test
  host: <%= ENV['DATABASE_HOST'] %>

production:
  <<: *default
  host: <%= ENV['DATABASE_HOST'] %>
  database: myapp_production
  username: <%= ENV['DATABASE_USER'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>

mystore:
  adapter: oracle_enhanced
  host: <%= ENV['mystore_db_host']%>
  port: <%= ENV['mystore_db_port']%>
  database: <%= ENV['mystore_db_name']%>
  username: <%= ENV['mystore_db_user']%>
  password: <%= ENV['mystore_db_password']%>

Далее я создаю класс базовой модели в папке lib/mystore_migration:

module MystoreMigration
  class MystoreModel < ApplicationRecord
    self.abstract_class = true
    establish_connection(:mystore)
  end
end

Другие классы моделей, используемые задачей rake, наследуют вышеуказанный MystoreMigration класс.

Далее, когда я только что попытался инициализировать одну из моделей, использующих соединение mystore в тестовом файле RSpec:

MystoreMigration::ShopInfo.new(
      address: Faker::Address.street_address,
      address2: Faker::Address.street_name,
...
)

и запустить его не удалось:

OCIError:
  ORA-12162: TNS:net service name is incorrectly specified

Похоже, что RSpec пытался использовать другие настройки / базу данных или что-то еще вместо того, что я определил с помощью establish_connection(:mystore).

Если я добавлю unless Rails.env.test? условие к establish_connection:

module MystoreMigration
  class MystoreModel < ApplicationRecord
    self.abstract_class = true
    establish_connection(:mystore) unless Rails.env.test?
  end
end

сообщение об ошибке отличается и говорит, что может установить отношения:

ActiveRecord::StatementInvalid:
       PG::UndefinedTable: ERROR:  relation "STORE_INFO" does not exist
       LINE 8:                WHERE a.attrelid = '"STORE_INFO"'::regclass

Как вы видите, в первом случае он пытался подключиться к базе данных Oracle, но это не удалось. Во втором случае он попытался подключиться к базе данных Postgresql (неправильно, так как он используется в других средах, кроме mystore).

Если я запускаю задачу rake, которая использует соединение mystore, она работает, - запуск тестов - не выполняется. Что в этом плохого ?

Я использую Rails 5.2.0, ruby 2.5.0, macOS. Спасибо.

1 Ответ

0 голосов
/ 13 июля 2018

Похоже, что при запуске тестов Rails будет запрашивать базу данных, определенную в группе test в database.yml, - в моем случае это myapp_test. Но при запросе моделей, использующих соединение mystore, он не найдет соответствующие таблицы, поскольку для этих моделей в среде test не определено соединение с базой данных. Это означает, что единственное решение - это смоделировать все запросы к базе данных для моделей, использующих соединение mystore.

...