web-dev-qa-db-ja.com

FactoryBotは、モデルの作成後にファクトリを生成できますか?

Gemfileのdevブロックとtestブロックにfactory_bot_Rails gemを含めると、Railsはモデルの生成時にファクトリを自動的に生成します。

モデルが生成された後にファクトリを生成する方法はありますか?


エドゥアルドサンタナの回答は正しいはずです

注:FactoryBotは以前はFactoryGirlという名前でした。

46
GuiDoody

--fixture-replacementオプションを使用すると、Railsでテストデータを作成するために何を生成するかを指定できます。次のように、これをconfig/application.rbファイルでデフォルトとして設定できます。

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

まず、ソースプロジェクトを見て、それがどのように実装されているかを確認します。

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

その後、それがどのように機能するかを推測してみてください:

Rails g factory_bot:model Car name speed:integer

結果は次のとおりです。

create  test/factories/cars.rb

そして内容:

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

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

Rails gを使用すると、いつでも元に戻すことができます。Rails d

Rails d factory_bot:model Car name speed:integer

注:FactoryBotは以前はFactoryGirlという名前でした。

141
Eduardo Santana

私はまさにこれのための宝石を持っています https://github.com/markburns/to_factory

7
Mark Burns

これは答えではありませんが、まだコメントすることはできません。問題の一部を解決するためにこれを使用できると思います。 schema_to_scaffoldというgemを使用して、factory_girl:modelコマンド文字列を生成できます。それは出力します:

Railsはfactory_girl:model users fname:string lname:string bdate:date email:string encrypted_pa​​ssword:stringを生成します

schema.rbまたは名前を変更したschema.rbから。

チェック ここ または ここ

2
frenesim

これは、Rails g factory_bot:model Userを使用して動作します。コマンドを実行するか、コマンドを出力するだけです。値を入力する必要があります。

@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
1
Davinj

RSpecを使用していて、spec/factoriesディレクトリにファクトリを作成する場合は、次のコマンドを使用します

Rails g factory_girl:model Car name speed:integer --dir spec/factories
0
Ruto Collins