在我看来,就我的目的而言,factory_girl
完全糟透了。一些限制包括:
如果我包含debugger
语句,则将它们视为模型属性。我没有调用调试器,只是遇到了奇怪的错误。
FactoryGirl.define do
factory :admin do
name do
debugger # <-- Does not work.
Forgery(:name).full_name
end
email { Forgery(:email).address }
debugger # <-- Does not work either.
password "secret"
end
end
我是太愚蠢还是没有优雅的方法来向用户添加两个帖子?
FactoryGirl.define do
factory :post do
title "Foobar"
content "Some content"
end
factory :user do
name { Forgery(:name).full_name }
email { Forgery(:email).address }
# This does not work, if the Post model requires Post#user to be set.
posts [FactoryGirl.create(:post), FactoryGirl.create(:post)]
end
end
另见Factory Girl - Why are Records being continually created?
我无法记住发生的事情,但是工厂女孩经常出现奇怪的问题。
所以给出了这些例子。对于没有这些问题的factory_girl有什么替代方案吗?
答案 0 :(得分:5)
我同意并发现工厂女孩过于复杂。
我刚才写了一个更简单的宝石(至少在当时)是基于工厂女孩的测试的替代品。
工厂定义使用更简单的Ruby,因此表现得像你期望的那样。
答案 1 :(得分:2)
为什么要在工厂定义中而不是在生成的对象的代码中进行调试?
出了什么问题
user = FactoryGirl.create(:user)
2.times do
FactoryGirl.create(:post, user: user)
end
答案 2 :(得分:-1)
DSL中的调试器语句可能会有问题。你不知道它什么时候会运行。
FactoryGirl可以运行DSL,保存工厂的表示,并在使用工厂时在内存中使用内部表示。
此外,除了self之外,没有可供检查的变量。自我将成为构建定义的细菌对象。
冒着回答全部为FactoryGirl辩护的风险,如果您对FactoryGirl的替代方案是用于填充数据的DSL,那么您仍然会遇到调试支持的问题。
替代品包括灯具,只需调用ActiveRecord来填充测试数据。真的,FactoryGirl没有太多的ActiveRecord,它只是更多面向符号的调用,所以人们可以制作有意义的符号名称,这是FactoryGirl应该做的。
你不能把一个调试器语句放在一个fixture的中间,或者在你发送给create方法的hash的中间,但至少你不会被诱惑。
(另见工厂女孩 - 为什么记录会不断创建?)是FactoryGirl完美运行的一个例子,但用户告诉它创建四条记录,然后在创建四条记录时感到惊讶。)
所以也许如果你坚持使用固定装置和ActiveRecord通话,那么事情就会变得愚蠢到你不会感到困惑。