1

在我看来,就我的目的而言,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 - 为什么不断创建记录?

倾向于触发铁轨中的奇怪错误

我不记得发生了什么,但 factory_girl 经常出现奇怪的问题。

所以给出这些例子。是否有没有这些问题的 factory_girl 替代品?

4

3 回答 3

5

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

不久前,我写了一个更简单的 gem,它(至少在当时)是基于 Factory Girl 的测试的替代品。

工厂定义使用更简单的 Ruby,因此其行为与您期望的一样。

看看: https ://github.com/ginty/craky

于 2013-06-07T21:25:17.703 回答
2

为什么要在工厂定义中而不是在结果对象的代码中进行调试?

有什么问题

user = FactoryGirl.create(:user)
2.times do
  FactoryGirl.create(:post, user: user)
end
于 2012-05-08T22:43:15.950 回答
-1

DSL 中的调试器语句可能会出现问题。你不知道它什么时候会运行。

FactoryGirl 可以运行 DSL,保存工厂的表示,并在使用工厂时使用内存中的内部表示。

此外,除了 self 之外,没有要检查的变量。自我将成为构建定义的胚芽对象。

冒着为 FactoryGirl 辩护的风险,如果您的 FactoryGirl 替代品是用于填充数据的 DSL,那么您仍然会遇到调试支持的问题。

替代方案包括固定装置和仅调用 ActiveRecord 来填充测试数据。真的,FactoryGirl 没有太多的 ActiveRecord,它只是更多面向符号的调用,所以人们可以制作有意义的符号名称,这都是 FactoryGirl 应该做的。

您不能将调试器语句放在夹具的中间,或者放在要发送到 create 方法的哈希中间,但至少您不会被诱惑。

(参见 Factory Girl - 为什么不断创建记录?,这是 FactoryGirl 完美运行的示例,但用户告诉它创建四个记录,然后当它创建四个记录时感到惊讶。)

所以也许如果你坚持使用固定装置和 ActiveRecord 调用,事情就会变得很简单,以至于你不会感到困惑。

于 2012-05-08T22:59:34.767 回答