2009-06-02 15 views
7

Actualmente estoy en el proceso de comenzar una migración de instalaciones a fábricas y enfrentar algunos desafíos de la base de datos de prueba.¿Cómo obtengo la base de datos de prueba Rails para reconstruir antes de cada prueba?

Cuando ejecuto todo el conjunto de pruebas, se limpia la base de datos y se vuelven a cargar los nuevos datos generados en fábrica. Sin embargo, cuando ejecuto pruebas de unidades individuales, la base de datos no elimina los valores anteriores.

Podría ejecutar rake db: test: preparar antes de cada prueba individual, pero eso ralentizaría mi desarrollo.

Éstos son mis ajustes de la prueba:

self.use_transactional_fixtures = false 
    self.use_instantiated_fixtures = true 

Por ejemplo:

require File.dirname(__FILE__) + '/../test_helper' 
class LocationTest < ActiveSupport::TestCase 
    test "should require name to save" do 
    location = Factory.create(:location) 
    end 
end 

se ejecutará una vez correctamente pero fallan en ejecuciones posteriores del archivo de prueba. Esto nunca ocurrió antes porque los dispositivos de prueba se cargarían en cada ejecución.

He añadido secuenciación fábrica, pero los atributos que sólo las secuencias durante cada ejecución:

Factory.define :location do |l| 
    l.sequence(:name) {|n| "place#{n}"} 
    l.street '123 N Pitt Street' 
    l.state_id 4 
    l.city 'San Francisco' 
    l.location_type_id LocationType::COMMON 
    l.shipper_id 1 
    l.zip 23658 
    end 

resultados en:

trunk>ruby test\unit\location_test.rb 
Loaded suite test/unit/location_test 
Started 
. 
Finished in 0.162 seconds. 

1 tests, 0 assertions, 0 failures, 0 errors 

>ruby test\unit\location_test.rb 
Loaded suite test/unit/location_test 
Started 
E 
Finished in 0.134 seconds. 

    1) Error: 
test_should_require_name_to_save(LocationTest): 
ActiveRecord::RecordInvalid: Validation failed: Name has already been taken 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/proxy/create.rb:5:in `result' 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/factory.rb:293:in `run' 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/factory.rb:237:in `create' 
    test/unit/location_test.rb:18:in `test_should_require_name_to_save' 

1 tests, 0 assertions, 0 failures, 1 errors 

Respuesta

1

Primero compruebe la configuración de la prueba para asegurarse de que sea la que desea, aunque sospecho que puede tener un motivo para rechazar la práctica estándar de ejecutar una prueba en una transacción (que se revierte al salir).

Las otras opciones es (1) el uso manual de las transacciones para las pruebas como la de arriba (donde no hay ya una transacción), más (2) Añadir un método teardown para limpiar manualmente las tablas pertinentes.

+1

Añadir: self.use_transactional_fixtures = true a esta clase y funciona! Gracias. Sí, hay razones por las que no puedo cambiarlo para todo el entorno. Ni siquiera pensé en cambiarlo solo por esta prueba ... ¡doh! Gracias de nuevo. –

0

Se podría reemplazar el método setup en su unidad de prueba para que elimine los datos que quiere limpiar.

0

Dado que todas las pruebas debe comenzar a partir de una base de datos limpia, tratar de hacer las cosas en su código base hasta el punto donde se puede transacciones de uso para cada prueba. La calidad de su prueba mejorará mucho como resultado.

Además, esto no está directamente relacionado con su pregunta ... pero nunca use accesorios Rails, bajo ninguna circunstancia, para nada. Usa fábricas en su lugar (echa un vistazo a la gema factory_girl_rails). Además, consulte RSpec en lugar de Test :: Unit.

Cuestiones relacionadas