ruby-on-rails - tests - run spec rails
Desactivar accesorios transaccionales para una especificación con RSpec 2 (4)
¿Cómo desactivo los dispositivos transaccionales para una sola especificación (o escenario de Steak) con RSpec 2? Probé algunas cosas encontradas en la web sin ningún éxito.
Esto lleva a una excepción de método indefinido.
describe "MyClass without transactional fixtures" do self.use_transactional_fixtures = false ... end
Esto simplemente no hace nada (el dispositivo transaccional aún está encendido):
describe "MyClass without transactional fixtures" do RSpec.configure do |config| config.use_transactional_fixtures = false end ... end
¿Qué más podría probar?
Lo hice de esta manera, con database_cleaner, para probar el código que usa transacciones (que entrará en conflicto con las soluciones transaccionales o cualquier otra estrategia para realizar pruebas transaccionales, por ejemplo, DatabaseCleaner.strategy =: truncation o: transaction):
# spec_helper.rb
config.use_transactional_fixtures = false
config.around(:each, :testing_transactions => true) do |ex|
DatabaseCleaner.strategy = nil
ex.run
DatabaseCleaner.strategy = :truncation
end
y en mis casos de prueba:
it "should not save if one of objects are invalid", :testing_transactions => true
No estoy seguro si eso se aplica a RSpec2, pero funciona bien con 3.
config.use_transactional_fixtures = true
config.around(:each, use_transactional_fixtures: false) do |example|
self.use_transactional_tests = false
example.run
self.use_transactional_tests = true
end
use_transactional_fixtures
cuenta la use_transactional_fixtures
(rspec-rails option) y use_transactional_tests
(activerecord fixtures option).
Normalmente agrego un ayudante como este:
def without_transactional_fixtures(&block)
self.use_transactional_fixtures = false
before(:all) do
DatabaseCleaner.strategy = :truncation
end
yield
after(:all) do
DatabaseCleaner.strategy = :transaction
end
end
Lo que me permite desactivar dispositivos transaccionales para un bloque específico en las especificaciones:
describe "doing my thing" do
without_transactional_fixtures do
it "does something without transaction fixtures" do
...
end
end
end
Esto solía ser un error (ver ticket # 197 ), pero parece que estoy bien ahora. Simplemente no sé si funcionará en una base por prueba (probablemente no). Si desea hacer esto, puede deshabilitar dispositivos transaccionales globalmente poniendo config.use_transactional_fixtures = false
en el spec_helper.rb
y usar DatabaseCleaner para configurar eso.
He tenido un problema similar al probar páginas con javascript en el navegador (un escenario que no funciona con dispositivos transaccionales). He aquí cómo me las arreglé para http://github.com/lailsonbm/contact_manager_app : http://github.com/lailsonbm/contact_manager_app