我真的很喜欢使用Factory Girl来设置我的测试。我可以在一行中建立关联链。例如:
Factory.create(:manuscript)
自动创建日记,期刊所有者,手稿作者等。这使我能够保持我的设置块非常简单,这太棒了。
然而,当然需要付出代价。在后台创建多个对象意味着我的单元测试有时长达0.8秒。当你的应用程序很小时,这很好,但现在我有几百个测试,我的规格需要一分钟才能运行(不包括应用程序启动所需的时间)。它开始感到痛苦。
我对任何过于激烈的事情都不是特别感兴趣,比如嘲笑一切。至少在我的应用程序相对较小的时候,我想保持我的工厂女孩抽象。我只想找到一种方法让它们更快地工作。
有什么建议吗?
答案 0 :(得分:3)
如果您正在测试对象行为而不需要将它们实际保存到数据库,则可以使用Factory.build(:model)
。它基本上实例化对象及其关联,但不会将其写入数据库。这比创建和存储所有这些对象要快得多。如果您仍想将一些或大多数对象写入数据库,则可以设置SQlite内存测试数据库。 Here's an example
答案 1 :(得分:1)
不确定这个问题有一个很好的解决方案。正如Beerlington所建议的那样,使用Factory.build
而不是Factory.create
可以节省一些时间。但即便如此,也不如测试普通的旧红宝石物体那么快。事实上,如果你非常关心速度,工厂女孩不是一个好选择。
也就是说,通过阅读整个套件并自由使用rspec-set宝石,我能够进行一些相当显着的速度提升。这允许您为整组测试运行一次 - 而且只运行一次。它与使用before(:all)
类似,只是它利用事务来重置每个规范之间的对象状态。