Factory Girl - 它的目的是什么?

65

在rspec测试中,Factory Girl的目的是什么,我为什么不能使用before(:each)块?感觉Factory Girl和before(:each)之间唯一的区别就是工厂在测试外准备对象创建。这样理解对吗?


这是 FactoryGirl 如何与 ActiveReccord 交互的方式 https://cbabhusal.wordpress.com/2015/04/21/ruby-on-rails-factory-girl-how-it-interacts-with-activerecord/ - Shiva
1
这里的答案似乎已经过时且奇怪。 - Nakilon
3个回答

66

类似于 Factory GirlSham 这样的宝石允许您创建有效和可重用对象的模板。它们是响应于固定记录(必须加载到数据库中的固定记录)而创建的。在实例化对象时,它们允许更多的自定义,并旨在确保您拥有一个有效的对象可以使用。它们可以在测试中的任何位置以及在测试前后钩子中使用。

before(:each), before(:all), after(:each) 和 after(:all) 旨在为您提供一个共享的设置和清理位置,这些位置将被共享在测试组中。例如,如果您将为每个测试创建一个新的有效用户,则需要在 before(:each) 钩子中执行此操作。如果您要清除文件系统中的某些文件,则需要在 before 钩子中执行此操作。如果您的测试都创建一个临时文件并希望在测试后删除它,则需要在 after(:each) 或 after(:all) 钩子中执行此操作。

这两个概念的区别在于,工厂不旨在在测试周围创建钩子,而是旨在创建有效的 Ruby 对象和记录,以便您可以保持对象创建灵活和DRY。before 和 after 钩子旨在设置和清理任务,这些任务在示例组中共享,以便您可以将设置和清理代码保持DRY。


9
另一种表达方式是:一个 FactoryGirl 工厂就像一个“give_me_a_valid_model”函数。如果你需要在多个“before :each”块中使用它,这可以避免重复工作。如果设置有效模型很复杂(关联、确保唯一值等),那么它可以节省你更多的精力。 - Nathan Long

17

FactoryGirl(工厂女孩)可以替代测试中的固定数据。这样,您不必在更改数据模型时保持固定数据的最新状态。随着添加更多特殊情况,固定数据也很容易变得难以处理。

FactoryGirl可以动态生成数据,并且添加和删除字段非常容易。此外,您可以像使用固定数据一样在设置中使用它。

这样是不是更清楚了呢?


2
我花了一些时间才明白工厂是夹具的“智能”替代品。我仍然很想学习更多关于模拟和存根之间区别的知识。 - Docunext
确实如此,谢谢。 :) 很高兴知道它们是fixture的好替代品。这有点奇怪,因为Hartl教程(顺便说一下,很不错)在fixture和Factory girl之间来回切换,让我感到困惑。现在我知道了,我可能会更经常地使用它。 :) - curiousdork

6

此外,固定定义在整个应用程序中是全局的。而工厂可以是本地的,因此特定于隔离测试用例的数据位于该特定上下文的设置中,而不是单个全局固定文件中。

这本书非常好地涵盖了这个主题,如果您想要更多的阅读材料。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接