Ruby on rails 工厂女孩的额外争论
我需要将额外的参数传递给factory girl,以便在回调中使用。类似这样(但实际上更复杂): 然后用如下方式创建它:Ruby on rails 工厂女孩的额外争论,ruby-on-rails,ruby,factory-bot,Ruby On Rails,Ruby,Factory Bot,我需要将额外的参数传递给factory girl,以便在回调中使用。类似这样(但实际上更复杂): 然后用如下方式创建它: Factory.create(:blog, :sample_posts => [post1, post2]) 有什么办法吗 一个选项是为附加帖子创建虚拟访问器,这些帖子是在创建钩子检查后创建的: class Blog has_many :posts attr_accessible :name, :title, ... # DB columns attr_a
Factory.create(:blog, :sample_posts => [post1, post2])
有什么办法吗 一个选项是为附加帖子创建虚拟访问器,这些帖子是
在创建钩子检查后创建的:
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])
另一个选项是使用build
而不是create
,并将:autosave
添加到集合中:
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])
显然,如果没有需要修改模型本身的变通方法,这在目前是不可能的。此错误报告于:由于瞬态属性()
例如:
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"
对于小于5.0的Factory Girl版本:
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"
如果您在factorygirl文件中打开类,我建议您这样做
require "user"
class User
attr :post_count
end
因此,您正在打开类,而不是覆盖它对于我的示例,我的实际情况要复杂一些。此外,我不喜欢因为FactoryGirl的局限性而污染模型。无论如何,谢谢:)您只需在测试环境中污染模型即可。事实上,您可以在工厂中执行此操作。rb
。问题49最近已关闭,请参阅我在此处提供的有用文档集,包括如何从创建后或其他块访问临时属性:忽略
已弃用。改用transient
。@JonathanTran非常感谢,我编辑了我的答案以反映变化!
require "user"
class User
attr :post_count
end