Gemfileのdevブロックとtestブロックにfactory_bot_Rails gemを含めると、Railsはモデルの生成時にファクトリを自動的に生成します。
モデルが生成された後にファクトリを生成する方法はありますか?
注:FactoryBotは以前はFactoryGirlという名前でした。
--fixture-replacement
オプションを使用すると、Railsでテストデータを作成するために何を生成するかを指定できます。次のように、これをconfig/application.rb
ファイルでデフォルトとして設定できます。
config.generators do |g|
g.fixture_replacement :factory_girl
end
まず、ソースプロジェクトを見て、それがどのように実装されているかを確認します。
その後、それがどのように機能するかを推測してみてください:
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という名前でした。
私はまさにこれのための宝石を持っています https://github.com/markburns/to_factory
これは、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
RSpecを使用していて、spec/factories
ディレクトリにファクトリを作成する場合は、次のコマンドを使用します
Rails g factory_girl:model Car name speed:integer --dir spec/factories