rails formularios formulario dinamicos consultas anidados anidadas ruby-on-rails ruby database rspec testing

ruby-on-rails - dinamicos - ruby on rails formularios anidados



¿Dónde almacena Rails los datos creados al guardar objetos activerecord durante las pruebas? (3)

"¿Pero por qué la consulta mysql no muestra datos en la base de datos mientras se ejecuta la prueba?"

Porque está en una transacción. Si desactiva los accesorios transaccionales, sus pruebas se ejecutarán mucho más lentamente que antes.

¿Dónde almacena Rails los datos creados al guardar objetos activerecord durante las pruebas?

Pensé que sabía la respuesta a esa pregunta: obviamente en la base de datos de _test . ¡Pero parece que esto no es verdad !

Usé este sistema para probar qué está sucediendo con los datos guardados de ActiveRecord durante las pruebas de rspec:

$ rails -d prueba de mysql

$ prueba de cd

$ nano config / database.yml ...

... crear bases de datos mysql test_test, test_development, test_production

$ script / generate rspec

$ script / generate rspec_model foo

editar la migración de Foo:

class CreateFoos

$ rake db:migrate

edit spec/models/foo_spec.rb:

require File.expand_path(File.dirname(__FILE__) + ''/../spec_helper'') describe Foo do before(:each) do @valid_attributes = { :bar => 12345 } end it "should create a new instance given valid attributes" do foo = Foo.new(@valid_attributes) foo.save puts "sleeping..." sleep(20) end end

$ rake spec

Cuando veas "durmiendo ...", cambia a otro terminal abierto con una sesión de mysql conectada a la base de datos test_test y hazlo:

mysql> select * from foos; Conjunto vacío (0.00 seg)

¿Por qué la sesión de mysql no muestra ningún registro en la base de datos test_test mientras se ejecuta la prueba?


Los elementos en la base de datos de prueba se borran por defecto después de ejecutar cada prueba, por diseño. Esto se hace para asegurarse de que cada una de sus pruebas tenga su propia zona de pruebas para jugar, que no cause ninguna interacción con las pruebas anteriores.

Nuevamente, esto es por diseño. No desea pruebas que manipulen el mismo conjunto de datos (o dependan de la ejecución sincrónica), porque no hay garantía de orden de ejecución.

Sin embargo, creo que si modifica su archivo test / test_helper.rb para decir esto:

self.use_transactional_fixtures = false

en lugar de

self.use_transactional_fixtures = true

Causará que los datos en su base de datos de prueba persistan.

TAMBIÉN: Mi consejo está específicamente diseñado para trabajar con Test :: Unit, no con RSpec. Sin embargo, imagino que hay una configuración similar a su spec_helper.rb que debería estar buscando.


Puede observar los registros que se agregan a la base de datos de prueba con:

tail -f log/test.log

Debería ver las transacciones pasando mientras se ejecutan las pruebas.