ruby-on-rails - matchers - rspec ruby
Rieles RSpec con mĂșltiples bases de datos (4)
Ejecuto una aplicación de Rails, y estamos en el proceso de dividir nuestro proceso de registro en una aplicación separada. La aplicación de registro tiene su propia base de datos separada (para CMS y prospectos de recopilación), pero también necesita tener acceso a la base de datos principal. Esto funciona muy bien usando ActiveRecord::Base.establish_connection
.
Sin embargo, me gustaría poder escribir algunas especificaciones. El problema es cómo puedo escribir especificaciones / pruebas sin borrar mi base de datos de desarrollo cada vez que se ejecutan mis pruebas. Si entro en la consola en modo de prueba, es obvio que el modo de prueba está enganchado en la base de datos de desarrollo desde mi aplicación principal.
Así es como se ve mi archivo database.yml:
development:
database: signup_dev
test:
database: signup_test
main_app_dev:
database: main_app_dev
main_app_test:
database: main_app_test
Basado en este archivo, me gustaría establish_connection
my_app_dev
para conectarme a la base de datos my_app_dev
en modo de desarrollo y my_app_test
en modo de prueba. ¿Algunas ideas?
Acabamos de usar la interpolación para esto:
class ServiceModel < ActiveRecord::Base
establish_connection :"main_app_#{Rails.env}"
end
Lo divertido :"main_app_"
sintaxis :"main_app_"
hace un símbolo de una cadena. Esto también podría escribirse "main_app_#{Rails.env}".to_sym
. En cualquier caso con Rails 4.1 esto debe ser un símbolo (en 3.2 habíamos usado una cadena).
Esto es lo que se me ocurrió como mixin:
# 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''
Para que esto funcione con RSpec, esto debe cargarse en un inicializador; al parecer, cargarlo en el archivo de entorno hace que se cargue demasiado tarde y no funcionará.
Ryan, también estábamos en el proceso de migrar de un almacén de datos a otro. Necesitábamos desarrollarnos en dos bases de datos y mantener migraciones y accesorios independientes para cada una.
Creé una gema llamada Secondbase para ayudar con esto. Esencialmente, le permite administrar dos bases de datos sin problemas en una sola aplicación de Rails. Quizás también solucione tu problema: https://github.com/karledurante/secondbase
Tenemos una joya que es básicamente una colección de modelos ActiveRecord que se conectan a nuestro sistema heredado. En nuestro caso, tenemos todos esos modelos contenidos en un módulo desde el cual se conectan todos los modelos relacionados con la base de datos heredada.
module Legacy
class Base < ActiveRecord::Base
establish_connection :legacy
end
class User < Base
end
end
Con esta configuración, hace que sea muy fácil cambiar la conexión de la base de datos. Si realmente busca esa detección automática, puede poner lógica en su clase base para determinar qué base de datos usar:
module Legacy
class Base < ActiveRecord::Base
if Rails.env == ''test''
establish_connection :legacy_test
else
establish_connection :legacy
end
end
O simplemente dile a tu módulo qué conexión usar en tu ayudante de especificaciones:
# spec/spec_helper.rb
Legacy::Base.establish_connection(ActiveRecord::Base.configurations[''legacy_test''])
Personalmente, recomendaría la segunda opción. Por supuesto, ambas soluciones dependen de modelos de espacio de nombres.
Mirar