我怎样才能有更快的测试并仍然使用Factory Girl?

时间:2011-06-09 02:06:18

标签: ruby-on-rails unit-testing rspec factory-bot

我真的很喜欢使用Factory Girl来设置我的测试。我可以在一行中建立关联链。例如:

Factory.create(:manuscript)

自动创建日记,期刊所有者,手稿作者等。这使我能够保持我的设置块非常简单,这太棒了。

然而,当然需要付出代价。在后台创建多个对象意味着我的单元测试有时长达0.8秒。当你的应用程序很小时,这很好,但现在我有几百个测试,我的规格需要一分钟才能运行(不包括应用程序启动所需的时间)。它开始感到痛苦。

我对任何过于激烈的事情都不是特别感兴趣,比如嘲笑一切。至少在我的应用程序相对较小的时候,我想保持我的工厂女孩​​抽象。我只想找到一种方法让它们更快地工作。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

如果您正在测试对象行为而不需要将它们实际保存到数据库,则可以使用Factory.build(:model)。它基本上实例化对象及其关联,但不会将其写入数据库。这比创建和存储所有这些对象要快得多。如果您仍想将一些或大多数对象写入数据库,则可以设置SQlite内存测试数据库。 Here's an example

答案 1 :(得分:1)

不确定这个问题有一个很好的解决方案。正如Beerlington所建议的那样,使用Factory.build而不是Factory.create可以节省一些时间。但即便如此,也不如测试普通的旧红宝石物体那么快。事实上,如果你非常关心速度,工厂女孩不是一个好选择。

也就是说,通过阅读整个套件并自由使用rspec-set宝石,我能够进行一些相当显着的速度提升。这允许您为整组测试运行一次 - 而且只运行一次。它与使用before(:all)类似,只是它利用事务来重置每个规范之间的对象状态。