当我可以使用before(:each)
块时,工厂女孩在rspec测试中的目的是什么?感觉Factory Factory和before(:each)
之间的唯一区别是工厂在测试之外准备对象创建。这是对的吗?
答案 0 :(得分:62)
像Factory Girl和Sham这样的宝石允许您为有效和可重复使用的对象创建模板。它们是为了响应必须加载到数据库中的固定记录的灯具而创建的。它们允许在实例化对象时进行更多自定义,并且它们旨在确保您具有可以使用的有效对象。它们可以在测试的任何地方以及之前和之后的测试钩子中使用。
之前(:每个),之前(:all),之后(:every)和之后(:all)都旨在为您提供一个可以在测试组之间共享的设置和拆卸的位置。例如,如果您要为每个测试创建一个新的有效用户,那么您将希望在之前的(:each)挂钩中执行此操作。如果要从文件系统中清除某些文件,则需要在之前的挂钩中执行此操作。如果您的测试都创建了一个tmp文件,并且您想在测试后删除它,那么您将在after(:each)或after(:all)hook之后执行该操作。
这两个概念的不同之处在于,Factories并非旨在围绕您的测试创建钩子,它们旨在创建有效的Ruby对象和记录,以便您可以保持对象创建的灵活性和干燥性。挂钩之前和之后的目标是在示例组中共享的设置和拆卸任务,以便您可以保持设置和拆卸代码DRY。
答案 1 :(得分:16)
FactoryGirl取代了测试中的灯具。这样,您就不必在更改数据模型时使夹具保持最新状态。当您添加更多边缘情况时,灯具也会变得笨重。
FactoryGirl动态生成数据,添加和删除字段更加容易。此外,您可以在设置中使用它如何使用灯具。
这会让它更清楚吗?
答案 2 :(得分:6)
整个应用程序中的夹具定义也是全局的。工厂可以是本地的 - 因此特定于隔离测试用例的数据在特定上下文的设置中,而不是在单个全局灯具文件中。
如果你想要更多的阅读材料,This book可以很好地涵盖这个主题