在rspec测试中,Factory Girl的目的是什么,我为什么不能使用before(:each)
块?感觉Factory Girl和before(:each)
之间唯一的区别就是工厂在测试外准备对象创建。这样理解对吗?
在rspec测试中,Factory Girl的目的是什么,我为什么不能使用before(:each)
块?感觉Factory Girl和before(:each)
之间唯一的区别就是工厂在测试外准备对象创建。这样理解对吗?
类似于 Factory Girl 和 Sham 这样的宝石允许您创建有效和可重用对象的模板。它们是响应于固定记录(必须加载到数据库中的固定记录)而创建的。在实例化对象时,它们允许更多的自定义,并旨在确保您拥有一个有效的对象可以使用。它们可以在测试中的任何位置以及在测试前后钩子中使用。
before(:each), before(:all), after(:each) 和 after(:all) 旨在为您提供一个共享的设置和清理位置,这些位置将被共享在测试组中。例如,如果您将为每个测试创建一个新的有效用户,则需要在 before(:each) 钩子中执行此操作。如果您要清除文件系统中的某些文件,则需要在 before 钩子中执行此操作。如果您的测试都创建一个临时文件并希望在测试后删除它,则需要在 after(:each) 或 after(:all) 钩子中执行此操作。
这两个概念的区别在于,工厂不旨在在测试周围创建钩子,而是旨在创建有效的 Ruby 对象和记录,以便您可以保持对象创建灵活和DRY。before 和 after 钩子旨在设置和清理任务,这些任务在示例组中共享,以便您可以将设置和清理代码保持DRY。
FactoryGirl(工厂女孩)可以替代测试中的固定数据。这样,您不必在更改数据模型时保持固定数据的最新状态。随着添加更多特殊情况,固定数据也很容易变得难以处理。
FactoryGirl可以动态生成数据,并且添加和删除字段非常容易。此外,您可以像使用固定数据一样在设置中使用它。
这样是不是更清楚了呢?
此外,固定定义在整个应用程序中是全局的。而工厂可以是本地的,因此特定于隔离测试用例的数据位于该特定上下文的设置中,而不是单个全局固定文件中。
这本书非常好地涵盖了这个主题,如果您想要更多的阅读材料。