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?
Aparentemente, esto no es posible en este momento sin soluciones que requieran modificar el modelo en sí. Este error se informa en: http://github.com/thoughtbot/factory_girl/issues#issue/49
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])