【发布时间】:2014-01-14 12:52:24
【问题描述】:
在 RSPEC 中,Let 的行为是对单个示例进行记忆(it 块),但在某些情况下,就时间而言,这可能会导致一些潜在的讨厌的副作用。
我注意到,如果您设法尝试创建任何被认为昂贵的东西,例如大型模拟,则对象创建的整个过程将在每个调用它的示例中重复。
解决此问题的第一步是将模拟数据缩小到一定大小,这将大部分运行时间从约 30 秒缩短到约 0.08 秒。鉴于此,通过将被调用 3 次以上且没有任何形式的突变的 let 变量传输到实例,可以进一步提高速度(在本例中为 -0.02 到 -0.04)。
通常,可以推断出惰性评估是可取的,并且在某些情况下这样的事情是安全的代价。在大型测试套件(3000 多个测试)的上下文中,即使是 0.01-0.02 秒的差异通常也足以导致 20-30 秒的膨胀。当然,在某些情况下这是任意编号,但您可以看到为什么这是不受欢迎的,并会产生复合问题。
我的问题是:
- 在哪些情况下让不再可行?
- 有什么方法可以将它的记忆延伸到块上下文而不是示例上下文? ...或者这是一个可怕的想法?
- 是否有有效的方法来生成异常大量的模拟数据,这些数据加载时间可能不会超过 7 秒?我看到对工厂女孩的模糊提及,但在那个音符上有足够的争论,我不知道在当前情况下该怎么想。
感谢您的宝贵时间!
【问题讨论】:
-
嗨@lemur,你能提供一个代码示例(缩写,因为你的代码库很大)? Let 应该进行惰性评估,因此您所描述的行为不应该发生。 relishapp.com/rspec/rspec-core/v/2-6/docs/helper-methods/…
-
使用 let 定义一个 memoized 辅助方法。该值将在同一示例中的多个调用中缓存但不跨示例这就是问题所在。每个“it”块都是一个例子。不幸的是,我无法在此发布代码,但我会在周末给出类似场景的示例。
标签: ruby rspec mocking factory-bot let