工厂女孩 - 目的是什么?

cur*_*ork 60 ruby factory-bot

当我可以使用before(:each)块时,工厂女孩在rspec测试中的目的是什么?感觉就像Factory Girl和a之间的唯一区别before(:each)是工厂在测试之外准备对象创建.这是正确的吗?

Pan*_*kos 63

Factory GirlSham这样的宝石允许您为有效和可重复使用的对象创建模板.它们是为了响应必须加载到数据库中的固定记录的灯具而创建的.它们允许在实例化对象时进行更多自定义,并且它们旨在确保您具有可以使用的有效对象.它们可以在测试的任何地方以及之前和之后的测试钩子中使用.

之前(:每个),之前(:all),之后(:每个)和之后(:all)都旨在为您提供一个可以在测试组之间共享的设置和拆卸的位置.例如,如果您要为每个单独的测试创建一个新的有效用户,那么您将希望在之前的(:each)挂钩中执行此操作.如果要从文件系统中清除某些文件,则需要在之前的挂钩中执行此操作.如果您的测试都创建了一个tmp文件,并且您想在测试后删除它,那么您将在after(:each)或after(:all)钩子中执行此操作.

这两个概念的不同之处在于,Factories并非旨在围绕您的测试创建钩子,它们旨在创建有效的Ruby对象和记录,以便您可以保持对象创建的灵活性和干燥性.挂钩之前和之后的目标是在示例组中共享的设置和拆卸任务,以便您可以保持设置和拆卸代码干燥.

  • 另一种说法是:FactoryGirl工厂就像`give_me_a_valid_model`函数.如果您需要在多个`之前:每个`块中使用它,它会为您节省一些重复.设置有效模型(关联,确保唯一值等)越复杂,它就越省力. (7认同)

Srd*_*jic 16

FactoryGirl在测试中替换了灯具.这样,您就不必在更改数据模型时使夹具保持最新状态.当你添加更多边缘情况时,固定装置也会变得笨重.

FactoryGirl动态生成数据,添加和删除字段更加容易.此外,您可以在设置中使用它如何使用灯具.

这会让它更清楚吗?

  • 我花了一段时间才弄清楚工厂是灯具的"智能"替代品.我仍然有兴趣了解更多关于模拟和存根之间的区别. (2认同)

Joh*_*non 6

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

如果你想要更多的阅读材料,这本书很好地涵盖了这个主题