tutorial rails factorybot factory_girl_rails bot ruby-on-rails ruby factory-bot

ruby on rails - rails - Argumentos extra para Factory Girl



factory_girl_rails (5)

Necesito pasar argumentos adicionales a la chica de la fábrica para usarlos en una devolución de llamada. Algo como esto (pero más complejo en realidad):

Factory.define :blog do |blog| blog.name "Blah" blog.after_create do |blog| blog.posts += sample_posts blog.save! end end

y luego crearlo con algo como esto:

Factory.create(:blog, :sample_posts => [post1, post2])

¿Alguna idea de como hacerlo?



Esto ahora es posible sin ningún "truco" gracias a los atributos transitorios ( vea el comentario en el número 49 )

ejemplo:

FactoryGirl.define do factory :user do transient do bar_extension false end name {"foo #{'' bar'' if bar_extension}"} end end # Factory(:user).name = "foo" # Factory(:user, :bar_extension => true).name = "foo bar"

Para versiones de Factory Girl <5.0:

FactoryGirl.define do factory :user do ignore do bar_extension false end name {"foo #{'' bar'' if bar_extension}"} end end # Factory(:user).name = "foo" # Factory(:user, :bar_extension => true).name = "foo bar"


Otra opción sería usar build lugar de create y add :autosave a la colección:

class Blog has_many :posts, :autosave => true end Factory.define :blog do |blog| blog.name ''Blah'' blog.posts { |_| [Factory.build(:post)] } end Factory(:blog, :posts => [post1, post2]) #or Factory.build(:blog, :posts => [unsavedPost1, unsavedPost2])


Si está abriendo la clase dentro del archivo factorygirl, sugiero hacerlo como

require "user" class User attr :post_count end

para que estés abriendo la clase, en lugar de sobrescribirla


Una opción sería crear un acceso virtual para publicaciones adicionales que el gancho after_create verifique:

class Blog has_many :posts attr_accessible :name, :title, ... # DB columns attr_accessor :sample_posts # virtual column end Factory.define :blog do |blog| blog.name ''Blah'' blog.after_create do |b| b.posts += b.sample_posts b.save! end end Factory(:blog, :sample_posts => [post1, post2])