Rails RSpec с несколькими базами данных - PullRequest
0 голосов
/ 07 октября 2009

Я запускаю приложение Rails, и мы находимся в процессе разделения нашего процесса регистрации на отдельное приложение. Приложение регистрации имеет свою собственную отдельную базу данных (для CMS и потенциальных клиентов), но оно также должно иметь доступ к основной базе данных. Это работает очень хорошо, используя ActiveRecord::Base.establish_connection.

Однако я бы хотел написать некоторые спецификации. Проблема в том, как я могу писать спецификации / тесты, не очищая мою базу данных разработки при каждом запуске моих тестов? Если я захожу в консоль в тестовом режиме, очевидно, что тестовый режим подключается к базе данных разработки из моего основного приложения.

Вот как выглядит мой файл database.yml:

development: 
  database: signup_dev

test:
  database: signup_test

main_app_dev: 
  database: main_app_dev

main_app_test: 
  database: main_app_test

На основании этого файла я бы хотел establish_connection для подключения к базе данных my_app_dev в режиме разработки и my_app_test в тестовом режиме. Есть идеи?

Ответы [ 4 ]

2 голосов
/ 07 октября 2009

У нас есть драгоценный камень, который представляет собой коллекцию моделей ActiveRecord, которые подключаются к нашей прежней системе. В нашем случае у нас есть все те модели, которые содержатся в модуле, из которого соединяются все модели, связанные с устаревшей базой данных.

module Legacy
  class Base < ActiveRecord::Base
    establish_connection :legacy
  end

  class User < Base
  end
end

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

module Legacy
  class Base < ActiveRecord::Base
    if Rails.env == 'test'
      establish_connection :legacy_test
    else
      establish_connection :legacy
   end
end

Или просто скажите вашему модулю, какое соединение использовать в вашем помощнике спецификаций:

# spec/spec_helper.rb    
Legacy::Base.establish_connection(ActiveRecord::Base.configurations['legacy_test'])

Лично я бы порекомендовал второй вариант. Конечно, оба решения зависят от моделей пространства имен.

Peer

1 голос
/ 21 декабря 2010

Райан, мы также мигрировали из одного хранилища данных в другое. Нам нужно было разработать две базы данных и поддерживать отдельные миграции и фиксации для каждой.

Я создал гем под названием Secondbase, чтобы помочь с этим. По сути, он позволяет беспрепятственно управлять двумя базами данных в одном приложении Rails. Возможно, это решит и вашу проблему: https://github.com/karledurante/secondbase

0 голосов
/ 26 ноября 2014

Мы просто использовали для этого интерполяцию:

class ServiceModel < ActiveRecord::Base
  establish_connection :"main_app_#{Rails.env}"
end

Забавный синтаксис :"main_app_" делает символ из строки. Это также может быть написано "main_app_#{Rails.env}".to_sym. В любом случае с Rails 4.1 это должен быть символ (в 3.2 мы только что использовали строку).

0 голосов
/ 07 октября 2009

Вот что я придумал как миксин:

# lib/establish_connection_to_master_database.rb
module EstablishConnectionToMasterDatabase
  def establish_connection_to_master_database

    case RAILS_ENV
    when "development"
      establish_connection :master_dev
    when "test"
      establish_connection :master_test
    when "production"
      establish_connection :master
    end

  end
end
ActiveRecord::Base.send(:extend, EstablishConnectionToMasterDatabase)

# models/subscription.rb
class Subscription < ActiveRecord::Base
  establish_connection_to_master_database
end

# config/initializers/config.rb
require 'establish_connection_to_master_database'

Для того чтобы это работало с RSpec, его необходимо загрузить в инициализатор - очевидно, загрузка его в файл среды приводит к тому, что он загружается слишком поздно, и он не будет работать.

...