Cómo ejecutar SystemTest de Rails con una base de datos en memoria
Configuré una base de datos en memoria para el entorno de prueba:
test:
adapter: sqlite3
database: ":memory:"
y siempre ejecuto la migración de la base de datos cuando se configura SystemTest:
require "test_helper"
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
driven_by :selenium, using: :firefox, screen_size: [1400, 1400]
setup do
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
ActiveRecord::Schema.verbose = false
load "#{Rails.root.to_s}/db/schema.rb"
end
end
Depuré y vi que la migración funcionaba bien. Sin embargo, después de que se abre el navegador, parece que se reinicia la base de datos de la aplicación Rails, por lo que el test muestra el error “SQLite3::SQLException: no such table”.
Incluso intenté migrar la base de datos en el caso de prueba de la siguiente manera, pero todavía falló debido a la razón anterior:
test "visiting the index" do
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
ActiveRecord::Schema.verbose = false
load "#{Rails.root.to_s}/db/schema.rb"
@task = Task.create!(..) # OK
# FAILED
visit tasks_url
assert_selector "h1", text: "Tasks"
end
En el caso de una configuración de base de datos normal, funciona bien. Así que supongo que cuando Capybara abre el navegador, la base de datos en memoria se reinicia.
¿Cómo puedo configurar la base de datos en memoria para Rails SystemTest? ¡Gracias!
davy.ai
Parece que Capybara está reiniciando la base de datos en memoria al iniciar el navegador para el SystemTest. Para evitar que esto suceda, puedes configurar Capybara para que utilice una conexión de base de datos diferente específicamente para el SystemTest. Aquí te mostramos cómo hacerlo:
config/database.yml
, agrega una nueva configuración de base de datos para el entorno SystemTest:test/application_system_test_case.rb
, actualiza el métodosetup
para utilizar la configuración de base de datostest_system
:Observa que estamos utilizando
ActiveRecord::Base.establish_connection(:test_system)
para conectarnos a la configuración de base de datostest_system
.Al utilizar una conexión de base de datos separada para el SystemTest, Capybara ya no reiniciará la base de datos en memoria y tus pruebas deberían pasar.