2009-12-14 13 views
13

estoy usando seeds.rb para rellenar algunos datos de referencia del modelo de Estado:rieles Prevenir la prueba de eliminación de datos de semillas

State.create :name => 'Alabama', :abbreviation => 'AL' 
State.create :name => 'Alaska', :abbreviation => 'AK' 
# ... 

Aunque no estoy utilizando accesorios estatales (ya que es la semilla de datos, para empezar, creo que es no estaría seca a tener que duplicar este puramente para pruebas), el marco de pruebas rieles parece borrar todos los datos de semillas del Estado durante la prueba. (Estoy abandonando, recreando, migrando y resembrando la prueba db, y confirmé que los datos están allí antes de ejecutar una prueba unitaria).

El resultado es que esta afirmación tiene éxito en seeds.rb pero falla en una prueba de una línea :

assert_equal 51, State.all.size 

1) Failure: 
test_state_seeds_are_present(StateTest) [/test/unit/state_test.rb:24]: 
<51> expected but was 
<0>. 
1 tests, 1 assertions, 1 failures, 0 errors 

he intentado ambos modelos enumerando explícitamente no estatales en la declaración de clase accesorios de prueba de base, así como apretar la bandera accesorios transaccional (como era de esperar, esto sólo afecta a los registros creados durante la prueba). Naturalmente, la prueba en cuestión no está eliminando estos registros.

Los registros estatales siempre se borran. ¿Hay alguna manera de decirle a Rails que simplemente se deshaga de los datos de las semillas? ¿Debo duplicar todos los datos en los accesorios para asegurarme de que se vuelvan a cargar? A falta de un evento político importante, yo esperaría que los datos del estado sean relativamente estables.

tia

+0

Gracias chicos, voy a tratar tanto de (una sola vez) y weppos' (en la configuración) sugerencia para las semillas de cargar explícitamente Lucas datos en pruebas y ver cuál funciona mejor para mis propósitos. Tomaré como un hecho que las pruebas siempre nukearán primero los datos de DB. – aaron

Respuesta

12

pruebas borrar todos los datos de la base de datos y luego cargar sus accesorios (si tiene alguno).

que necesita para obtener su ayudante de prueba para cargar el archivo semilla antes de las pruebas se ejecutan. Hay un par de maneras de hacer eso, echa un vistazo a mi pregunta similar: How to load db:seed data into test database automatically?

La forma más sencilla es probablemente sólo para añadir

require "#{Rails.root}/db/seeds.rb"

a la parte superior de su archivo test_helper.rb (suponiendo que el uso el marco de prueba incorporado).

+1

Esto no funciona para mí, si agrego esa línea a mi dispositivo, funciona bien, pero si lo pongo en test_helper.rb, los datos de inicialización parecen haberse desvanecido antes de que mis pruebas sean alcanzadas. – dangerousdave

+3

¿Tienes un archivo yml de fixture para una clase que intentas completar en tu archivo semilla? Porque eso eliminará todos los datos cuando se ejecuten los dispositivos. Borre el archivo del accesorio para las semillas; o si no puede hacer eso, use el ejemplo de Simone donde los datos del dispositivo se cargan antes de cada prueba individual. –

+0

ahh, he comentado mi archivo .yml, pero parece que no es suficiente, su mera presencia hace que se sobrescriban los datos de inicialización. Lo borró, y todo está bien, gracias por su ayuda, Luke – dangerousdave

4

La función de "semilla" no está integrado en la arquitectura de prueba. Las pruebas se basan en accesorios y cada vez que ejecuta el conjunto de pruebas, Rails carga los datos de los dispositivos y reemplaza el contenido existente.

Sin embargo, tener la base de datos poblada con sus datos semilla es muy sencillo.

En el archivo test_helper.rb añadir un nuevo método de configuración en la clase base ActionSupport::TestCase.

class ActionSupport::TestCase < ... 

    setup :load_seeds 

    protected 

    def load_seeds 
     load "#{Rails.root}/db/seeds.rb" 
    end 

end 
+0

Esto va a volver a cargar sus datos de inicialización antes de cada caso de prueba, que dado accesorios transaccionales probablemente no necesite hacer. Mientras se supone que los datos de la semilla se mantienen constantes (lo cual debería) solo debería cargarlos una vez. –

+0

Eso es lo que pensé Luke, pero parece que se borra independientemente, por lo que parece que tendré que implementar algún tipo de solución para asegurarme de que esté presente en el DB para las pruebas. – aaron

+1

¿Tiene un archivo states.yml en su directorio de accesorios? Incluso si está vacío, se eliminarán los datos de tus estados. Siempre me aseguro de eliminar accesorios para mis tablas de datos de semillas (en realidad, ya no uso más los accesorios, pero esa es otra historia). –

0

Estoy de acuerdo con weppos en cuanto a la mejor manera de hacer esto, sin embargo, en aras de la exhaustividad y por el bien de las personas que ya puede tener archivos de datos se puede tomar otro enfoque y las semillas de su base de datos de la accesorios existentes.

Esto se logra haciendo algo como lo siguiente en el archivo db/seeds.rb

RAILS_FIXTURES = "#{Rails.root}/spec/fixtures" 

models_loaded_from_fixtures = %w[Modela Modelb Modelc ....] 

models_loaded_from_fixtures.each do |model| 
    Fixtures.create_fixtures(RAILS_FIXTURES, "#{model.tableize}") 
    puts "Loaded #{model.constantize.all.size} #{model.pluralize}" 
end 

Se podría alternativamente leer el directorio fixures y crear una matriz de nombres de archivos para procesar, elegí el proceso anterior como deseaba poder especificar con cuál de mis muchos accesorios existentes deseaba sembrar el DB.

0

En primer lugar, cuestiono la necesidad de escribir una prueba como esa. ¿Está probando que la tarea de rastrillo de datos semilla funciona correctamente o quiere probar el comportamiento de su implementación de la clase de estado? Asumo lo segundo, así que escribiría pruebas que se enfocan en el comportamiento y usar Factory Girl (o similar) ya que mencionas que no estás usando accesorios. Asegúrese de eliminar la línea fixtures :all de test/test_helper.rb.

Para inyectar una tarea en el flujo normal de las pruebas de funcionamiento, este es un enfoque que siempre ha trabajado para mí:

namespace :test do 
    task :force_environment do 
    ENV['RAILS_ENV'] = 'test' 
    RAILS_ENV.replace('test') 
    end 
end 

%w(test:units test:functionals test:integration).map do |task_name| 
    task = Rake::Task[task_name] 
    task.clear_prerequisites 

    task.enhance %w(db:test:prepare test:force_environment db:seed) 
end 

sólo hay que poner que en un archivo llamado lib/tasks/testing.rake y va a recogerlo cuando siguiente ejecución rake test u otra tarea relacionada con la prueba.

+0

Hola Patrick. De hecho, no necesito probar el modelo de estado per se, que fue solo un ejemplo que demuestra que los datos de inicialización no están presentes. El modelo de estado (datos de referencia) se usa para validar direcciones, y las pruebas de validación de direcciones estaban fallando porque los datos de estado no estaban en la base de datos. – aaron

+0

Eso tiene más sentido. La tarea de Rake debería funcionar para ti, pero parece que tienes las cosas funcionando. –

0

Tuve el mismo problema, pero la respuesta estándar no funcionó para mí.

Mi problema involucraba lugares en los archivos de clase que realizaban una búsqueda en la base de datos para constantes y named_scopes. No pude encontrar ninguna forma de tener los datos de inicialización cargados en el momento correcto.

Encontré una manera de eludir la eliminación, que estaba sucediendo a pesar de que había eliminado el archivo de mi dispositivo para la tabla faltante.

RAILS_ENV = rastrillo prueba db:. Semilla rubí -Itest prueba/unidades/* rb

Cuestiones relacionadas