Rails FactoryGirl定义语法

时间:2012-06-16 04:58:18

标签: ruby-on-rails factory-bot

在使用factory girl gem时,我们创建一个factory.rb文件,其语法为

FactoryGirl.define do
  factory :model do
    ...  
  end
  ...
end

那么FactoryGirl.define语法到底意味着什么呢? 它是否类似于

class FactoryGirl
  def factory :model do
  end
end

由于

2 个答案:

答案 0 :(得分:2)

与许多Ruby宝石一样,FactoryGirl定义了“域特定语言”或DSL,以简化配置。这是一种常见的模式。

您的示例如下所示:

FactoryGirl.define do
  factory :model do
    ...  
  end
  ...
end

正在发生的事情是使用参数factory调用:model方法,该方法另外传递了一个块。与往常一样,所讨论的方法可以自由决定如何处理块。在这种情况下,它会在工厂生成过程中保存并稍后执行。

你对它的重新解释没有任何意义,因为那不是有效的Ruby。您不能将符号作为参数说明符。请记住,factory是一种预先存在的方法,而不是您当时正在定义的方法。

如果这有点朦胧,你需要更多地试验一下块,看看它们在Ruby中是如何工作的。它们被用于许多事情,所以你需要了解每个人如何设置对块可以做什么,它应该返回什么以及它将被调用多少次的期望(如果有的话)。

答案 1 :(得分:1)

在ruby中,do end的任何内容都是一个块,并且所有块都附加到方法上。

因此,在您的示例中,FactoryGirl.define是一个以块作为参数的方法调用。 factory :model也是一个以块作为参数的方法调用,但在这种情况下,:model也是传入的参数。

您可以考虑在FactoryGirl 概念中定义的方法,如下所示:

class FactoryGirl
  def self.define
    yield # do something w/ the block passed in
    ...
  end

  def factory(model_name, &block)
    block.call # do something w/ the block passed in
    ...
  end
end