es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  ,

Answer

  1. Avatar for 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:

    1. En tu archivo config/database.yml, agrega una nueva configuración de base de datos para el entorno SystemTest:
    test:
      adapter: sqlite3
      database: db/test.sqlite3
    
    test_system:
      adapter: sqlite3
      database: ':memory:'
    
    1. Luego, en tu archivo test/application_system_test_case.rb, actualiza el método setup para utilizar la configuración de base de datos test_system:
    setup do
      DatabaseCleaner.strategy = :truncation
      DatabaseCleaner.start
    
      Capybara.current_driver = :selenium
      Capybara.run_server = true
      Capybara.app_host = "http://localhost:3000"
    
      ActiveRecord::Base.establish_connection(:test_system)
      load "#{Rails.root}/db/schema.rb"
    end
    

    Observa que estamos utilizando ActiveRecord::Base.establish_connection(:test_system) para conectarnos a la configuración de base de datos test_system.

    1. Por último, actualiza tu código de prueba para utilizar la conexión correcta de base de datos:
    test "visitando el índice" do
      # Utiliza la conexión de base de datos test_system
      ActiveRecord::Base.establish_connection(:test_system)
    
      @task = Task.create!(...)
    
      visit tasks_url
      assert_selector "h1", text: "Tasks"
    end
    

    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.

Comments are closed.