what tutorial rails ruby-on-rails ruby rspec capybara capybara-webkit

ruby on rails - tutorial - Capybara no puede encontrar registros de la base de datos durante las especificaciones de características



selenium rails (5)

Tengo una especificación de características de JS que estoy intentando ejecutar con Capybara Webkit. Sin embargo, no parece poder encontrar los registros de mi base de datos.

La especificación en cuestión se ve así

it "should allow pledging to a Hardback level", js: true do book = FactoryGirl.create :book visit book_path(book) click_link "pledge-btn" end

Desafortunadamente, la solicitud para book_path(book) 404s porque el libro no se puede encontrar.

Si quito la :js , la prueba pasa.

Tengo DatabaseCleaner configurado para usar :truncation para las especificaciones JS como es el método recomendado .

# spec/support/database_cleaner.rb RSpec.configure do |config| config.use_transactional_fixtures = false config.before(:suite) do DatabaseCleaner.clean_with(:truncation) end config.before(:each) do DatabaseCleaner.strategy = :transaction end config.before(:each, :js => true) do DatabaseCleaner.strategy = :truncation end config.before(:each) do DatabaseCleaner.start DatabaseMetadata.create!(:sanitized_at => DateTime.now) end config.after(:each) do DatabaseCleaner.clean end end

Puedo puts el libro en la prueba y será encontrado.

it "should allow pledging to a Hardback level", js: true do book = FactoryGirl.create :book visit book_path(book) p Book.first # => .. the book instance click_link "pledge-btn" end

También he intentado este método de conexión compartida que tampoco parece solucionar el problema.

¿Qué más podría estar mal?


Creo que su principal problema es que su rails_helper.rb tiene la siguiente línea comentada:

Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

Esto significa que el archivo database_cleaner.rb nunca se carga.


Me encontré con este mismo problema y tenía una configuración muy similar. Después de mirar el Léame de DatabaseCleaner, encontré esta pequeña nota:

También se recomienda usar append_after para garantizar que DatabaseCleaner.clean ejecute después de la instalación después de la prueba capybara / rspec.

Source

Eso significa cambiar tu

config.after(:each) do DatabaseCleaner.clean end

a

config.append_after(:each) do DatabaseCleaner.clean end

Tenga en cuenta el append_after lugar de after Esto solucionó mi problema.


Puede tener config.use_transactional_fixtures = true establecido en su spec_helper.rb . Esto anularía lo que tienes arriba.

Desea eliminar esta línea de su spec_helper.rb o cambiarla para que sea false .


Si crea registros en un bloque before(:all) , estarán disponibles.

before :all do @book = FactoryGirl.create :book end it "should allow pledging to a Hardback level", js: true do visit book_path(@book) click_link "pledge-btn" end

Capybara ejecuta el servidor de rieles en un proceso separado de las pruebas, para que cada uno obtenga su propia conexión a la base de datos. Por lo tanto, el servidor no accede a los registros creados en la transacción para la prueba.

Debido a que no están dentro de una transacción, asegúrese de limpiarlos con DatabaseCleaner en su spec_helper.rb :

config.after(:all, :type => :feature) do DatabaseCleaner.clean end


Trabajando en un proyecto heredado, tuve este problema, fue causado por el cambio de la estrategia DatabaseCleaner a: truncamiento como el siguiente:

config.before(:suite) do DatabaseCleaner.strategy = :truncation DatabaseCleaner.clean Test::Seeder.seed! DatabaseCleaner.strategy = :transaction end

Por lo tanto, eliminar DatabaseCleaner.strategy = :transaction ayudó en mi caso