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 queDatabaseCleaner.clean
ejecute después de la instalación después de la prueba capybara / rspec.
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