web-dev-qa-db-fra.com

FactoryGirl peut-il générer des usines après la création de vos modèles?

Lorsque vous incluez la gem factory_girl_Rails dans vos blocs de développement et de test dans Gemfile, Rails génère automatiquement des usines lors de la génération de vos modèles. 

Existe-t-il un moyen de générer des usines après la génération de vos modèles?


La réponse d'Eduardo Santana doit être correcte

42
GuiDoody

L'option --fixture-replacement vous permettra d'indiquer à Rails ce qu'il faut générer pour créer des données de test. Vous pouvez définir ceci comme valeur par défaut dans votre fichier config/application.rb, comme suit:

config.generators do |g|
  g.fixture_replacement :factory_girl
end
17
cjhveal

Tout d’abord, regardez le projet source pour savoir comment il a été implémenté:

https://github.com/thoughtbot/factory_bot_Rails/blob/master/lib/generators/factory_bot/model/model_generator.rb

Après cela, essayez de deviner comment cela fonctionne:

Rails g factory_girl:model Car name speed:integer

Le résultat est:

create  test/factories/cars.rb

Et le contenu:

# Read about factories at https://github.com/thoughtbot/factory_girl

FactoryGirl.define do
   factory :car do
     name "MyString"
     speed 1
   end
end

N'oubliez pas que lorsque vous utilisez Rails g, vous pouvez toujours l'annuler, avec Rails d

Rails d factory_girl:model Car name speed:integer
126
Eduardo Santana

J'ai un petit bijou pour cela/ https://github.com/markburns/to_factory

7
Mark Burns

Ce n'est pas une réponse, mais comme je ne peux pas encore commenter: Je pense que vous pouvez l'utiliser pour résoudre une partie de votre problème. Vous pouvez utiliser une gemme appelée schema_to_scaffold pour générer une chaîne de commande factory_girl: model. Il produit:

Les Rails génèrent factory_girl: les utilisateurs du modèle fname: chaîne lname: chaîne bdate: date email: chaîne

à partir de votre schema.rb ou votre renommé schema.rb. 

Vérifiez ici ou ici

2
frenesim

Cela fonctionne pour moi en utilisant Rails g factory_bot: model User Soit en exécutant la commande, soit simplement en l'exécutant . Vous devez toujours renseigner la valeur.

@run_command        = true
@force              = true
@columns_to_ignore  = %w[id created_at update_at]
@tables_to_ignore = %w[schema_migrations ar_internal_metadata]
tables = ActiveRecord::Base.connection.tables.reject{|t| (@tables_to_ignore || []).include?(t)}

tables.each do |table|
  klass = table.singularize.camelcase.constantize
    command = "Rails g factory_bot:model #{klass.to_s} #{klass.columns.reject do |c|
      (@columns_to_ignore || []).include?(c.name)
    end.map do |d|
      "#{d.name}:#{d.sql_type == 'jsonb' ? 'json' : d.type}"
  end.join(' ')}"
  command << ' --force' if @force
  puts command
  puts %x{#{command}} if @run_command
  puts (1..200).to_a.map{}.join('-')
end
0
Davinj