Ruby on rails 减少n+;1使用Bullet和RSpec gems的查询

Ruby on rails 减少n+;1使用Bullet和RSpec gems的查询,ruby-on-rails,ruby,rspec,rails-bullet,Ruby On Rails,Ruby,Rspec,Rails Bullet,用RSpec使用子弹宝石的有效方法是什么?现在,我觉得如果我在当前的单元测试框架中使用它,我会收到很多测试通知或失败,因为测试本身中的n+1查询与生产应用程序中发生的事情无关,例如检查值或关联。因此,修复n+1故障不需要在我的控制器或模型上设置任何内容,而是需要在我的测试设置中设置一些内容,以避免抛出该特定错误,并且我看不到我的应用程序有任何真正的性能改进。最有效的方法根本不是。减少测试中的n+1查询可能有一些合理的优势,最明显的是加快总体执行时间。然而,很有可能的是,你要么正在或正在取得比以前

用RSpec使用子弹宝石的有效方法是什么?现在,我觉得如果我在当前的单元测试框架中使用它,我会收到很多测试通知或失败,因为测试本身中的n+1查询与生产应用程序中发生的事情无关,例如检查值或关联。因此,修复n+1故障不需要在我的控制器或模型上设置任何内容,而是需要在我的测试设置中设置一些内容,以避免抛出该特定错误,并且我看不到我的应用程序有任何真正的性能改进。

最有效的方法根本不是。减少测试中的n+1查询可能有一些合理的优势,最明显的是加快总体执行时间。然而,很有可能的是,你要么正在或正在取得比以前更少的显著收益。我还发现,编写额外的代码来帮助支持测试,而不是为应用程序的整体价值做出贡献,通常是不吸引人的

请允许我提议另一种利用你的时间的方法。仅对您的舒适度进行绝对最低限度的单元测试。我个人喜欢关注复杂的方法,包括验证相关的问题和金钱或其他数学,你可能有不同的优先级。划清界限将腾出大量时间来编写测试套件中最无用和最脆弱的部分,这些部分将占用您大部分的维护预算

现在,你该怎么做才能把你所有的额外时间都用上呢?别担心,我们会给你找点事做的。。。您可以从编写一些验收测试开始,特别是对于使用您刚刚放弃了一大堆单元测试的对象的区域。现在,您的n+1警告实际上来自用户点击页面时的相同位置。现在,您可以继续删除所有n+1查询

但是等等!也不要那样做。相反,花更少的时间。然后,当子对象更新时,父对象也将更新。您可能会想,这与n+1查询有什么关系。看起来我们只是在添加查询

这就是问题所在。添加这个,并正确地测试它,将消耗空闲的单元测试和n+1消除时间(如果不小心的话,还有一些)。好的方面是,它更“真实”,对模型中无关紧要或不相关的实现更改更具弹性,对应用程序的巨大性能提升远远超出了通过急切地预先加载所有内容来消除每个n+1查询所能提供的。您将希望尽可能多地移动到嵌套缓存中,并尽可能延迟地加载所有内容,以充分利用此方法


n+1万岁

哇,这是一个很好的答案!非常感谢。DHH在文章中也说了同样的话