Apague los accesorios transaccionales para una especificación con RSpec 2


¿Cómo desactivo los accesorios transaccionales para una sola especificación (o escenario de carne) con RSpec 2? Probé algunas cosas que se encuentran en la web sin ningún éxito.

Esto conduce a una excepción de método indefinida.

describe "MyClass without transactional fixtures" do
  self.use_transactional_fixtures = false
  ...
end

Esto simplemente no hace nada (el accesorio transaccional todavía 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?

Author: Zardoz, 2010-10-04

4 answers

Esto solía ser un error (ver ticket #197), pero parece que ahora estoy bien. Simplemente no sé si funcionará en una base por prueba (probablemente no). Si desea hacer esto, puede deshabilitar los accesorios transaccionales globalmente poniendo config.use_transactional_fixtures = false en el spec_helper.rb y usar DatabaseCleaner para establecerlo.

He tenido un problema similar al probar páginas con javascript en el navegador (un escenario que no funciona con accesorios transaccionales). Así es como me las arreglé para evitarlo: http://github.com/lailsonbm/contact_manager_app

 7
Author: Lailson Bandeira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-13 00:46:11

Normalmente añado 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

Que me permite desactivar los accesorios 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
 27
Author: mattias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-09 11:37:42

Lo he hecho de esta manera, con database_cleaner, con el fin de probar el código que utiliza transacciones (que entrará en conflicto con transactional_fixtures o cualquier otra estrategia para hacer pruebas transaccionales, por ejemplo, DatabaseCleaner.estrategia = :truncamiento o :transacción):

# 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
 7
Author: Guilherme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-18 15:30:29

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

Tenga en cuenta la diferencia use_transactional_fixtures (opción rspec-rails) y use_transactional_tests (opción activerecord fixtures).

 0
Author: phil pirozhkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-12 08:13:46