2011-03-21 9 views
20

¿Es posible hacer esto?¿Cómo puedo usar Factory Girl en db/seeds?

Si es así, ¿cómo puede hacerlo?

+2

db/seeds.rb debe contener datos básicos específicos de producción que su sitio necesita para ejecutar. Las fábricas solo deberían usarse en sus pruebas, lo que le ayuda a ejecutar operaciones de forma aislada. ¿Estás tratando de acortar tu DB/semillas o algo así? – mnelson

Respuesta

14

(esta respuesta obras en los carriles 3.0.7)

he encontrado el problema es cómo se configura la Gemfile - que tiene que hacer algo en la línea de

gem 'factory_girl' 

group :test do 
    gem 'factory_girl_rails' 
end 

encontramos problemas que tiene factory_girl_rails outsi del entorno de prueba, que no logramos llegar al final (¿algo relacionado con la forma en que los raíles hacen el almacenamiento en caché?)

Una vez hecho esto, me gustaría cargar los datos de una biblioteca en lib, algo así como ...

require 'factory_girl' 
require 'spec/factories/user_factory' 

module Seeds 

    class SampleUsers 

    def self.run 
    u = Factory(:user) 
    end 
end 

Y a continuación, ejecutar este método desde dentro db: semilla mediante

Seeds::SampleUsers.run 
+1

Consulte el comentario de Hubble sobre la respuesta de Michael para una forma alternativa de hacer que Gemfile funcione. Parece que factory_girl_rails es seguro para requerir en db/seeds, pero no debería ser solicitado automáticamente por Rails a través de Bundler. Para evitar que eso ocurra, conjuntos de hubble: require => false. –

+0

¡Gran respuesta! Justo lo que necesitaba. Descubrí que recibiría errores si tuviera las dos declaraciones requeridas. Entonces no los tengo en mi implementación. – caspyin

+0

En los carriles 4, esto ya no es necesario: puede salirse con la grupo: desarrollo,: Prueba de hacer Gem '' factory_girl_rails A continuación, sólo requieren '' factory_girl_rails en lib/tareas/sample_data.rake. –

2

puede insertar el siguiente código en su spec_helper.rb, y hacer algunos ejemplos de los datos que desee (en este caso "productos" del archivo yaml):

seeds_file = File.join(Rails.root, 'db', 'seeds.yml') 
config = YAML::load_file(seeds_file) 
config["products"].each do |product| 
    FactoryGirl.create(:product, product) if !Product.find_by_name(product['name'])  
end 
25

Todo lo que necesita hacer es añadir "requieren 'factory_girl_rails'" hacer el PP /seeds.rb archivo. Esto te dará acceso a tus fábricas.

+10

Esto es genial, pero asegúrese de que: require => false está en su Gemfile para factory_girl_rails, de lo contrario causa problemas de dependencia de inicialización cuando intenta db: migrar y las fábricas representan modelos que aún no ha migrado. - Y luego necesitarás requerir 'factory_girl_rails' en tu spec_helper después de eso. –

11

en db/seeds.rb

require 'factory_girl_rails' 

10.times do 
    FactoryGirl.create :user 
end 
+2

FactoryGirl.create_list (: user, 10) –

13

Josh Clayton, el sustentador de factorygirl, recommends against using FactoryGirl in your seeds file. Sugiere utilizar ActiveRecord normal en su lugar.

+1

Un buen argumento para querer usar Factory Girl en las semillas es que nuestras semillas ActiveRecord se siguen rompiendo cada vez que alguien actualiza la API. Se rompe sin previo aviso. Para protegerse de eso, queremos que el archivo semilla esté cubierto por la prueba. Factory Girl puede ayudar con la siembra y la prueba. –

Cuestiones relacionadas