tutorial tests spec run rails matchers how ruby-on-rails ruby-on-rails-3 rspec rspec2

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