factory_girl的替代品

时间:2012-05-08 22:36:27

标签: ruby-on-rails factory-bot

在我看来,就我的目的而言,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?

倾向于在rails

中触发奇怪的错误

我无法记住发生的事情,但是工厂女孩经常出现奇怪的问题。

所以给出了这些例子。对于没有这些问题的factory_girl有什么替代方案吗?

3 个答案:

答案 0 :(得分:5)

我同意并发现工厂女孩过于复杂。

我刚才写了一个更简单的宝石(至少在当时)是基于工厂女孩的测试的替代品。

工厂定义使用更简单的Ruby,因此表现得像你期望的那样。

检查出来: https://github.com/ginty/cranky

答案 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通话,那么事情就会变得愚蠢到你不会感到困惑。