在使用factory girl gem时,我们创建一个factory.rb文件,其语法为
FactoryGirl.define do
factory :model do
...
end
...
end
那么FactoryGirl.define语法到底意味着什么呢? 它是否类似于
class FactoryGirl
def factory :model do
end
end
由于
答案 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