2

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

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

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

class FactoryGirl
  def factory :model do
  end
end

谢谢

4

2 回答 2

2

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

您的示例如下所示:

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

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

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

如果这有点模糊,您将需要更多地尝试块以了解它们在 Ruby 中的工作方式。它们被用于许多事情,因此您需要了解每个设置对块可以做什么、它应该返回什么以及它将被调用多少次(如果有的话)的期望。

于 2012-06-16T05:07:20.827 回答
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
于 2012-06-16T05:16:49.867 回答