【问题标题】:Proper way to use cache rspec `let` value使用缓存 rspec `let` 值的正确方法
【发布时间】:2022-11-02 23:30:16
【问题描述】:

我有这样的课:

class Calculation
  def initialize
    heavy_calculation
  end

  def result
    'ok'
  end

  def errors
    nil
  end

  private
  
  def heavy_calculation
    p "Performing CPU-heavy calculations"
  end
end

和 RSpec 用于检查两种公共方法

describe Calculation do
  let(:calculations) { Calculation.new }

  it 'result equal ok' do
    expect(calculations.result).to eq('ok')
  end

  it 'errors equal nil' do
    expect(calculations.errors).to be_nil
  end
end

运行这段代码,我们在终端中得到了两次"Performing CPU-heavy calculations",所以计算构造函数被调用了两次

我试图重构此代码,以便构造函数只运行一次 - 但没有找到任何完美无瑕的解决方案,无需运行计算代码两次,也不会将值泄漏到其他规范文件

那么关于如何正确解决这个问题的任何建议?

【问题讨论】:

  • before(:all) 中设置一个实例变量怎么样?或者,如果可以接受添加新的依赖项,这可能会有所帮助:test-prof.evilmartians.io/#/recipes/let_it_be
  • 如果运行两个或更多规范,是不是在 before_all 结果初始化所有规范中的该变量?
  • 据我记得,如果它是在示例组中定义的,那么它对于这个示例组来说是本地的。
  • before(:context) 在这个...嗯上下文中是相同的 :) 不鼓励这样做,因为状态可能会在示例之间泄漏,但这是你的情况正是想要的效果,不是吗?所以这是一个权衡:你要么有干净的隔离测试,但做了几次繁重的计算,或者你记住了繁重的计算并有更好的测试套件性能,但你的测试不再是孤立的......

标签: ruby rspec


【解决方案1】:

好的。我认为没有合适的方法来解决这个问题

我基本上有两个选择:

  1. 通过使用before(:all) 在示例之间泄漏数据(Heavy calculation),因此无法正确隔离测试用例
  2. 隔离但多次执行繁重的计算

    所以这些选择中的任何一个都有不同的权衡,我必须选择其中一个

    并且似乎以当前方式离开测试是更正确的选择

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 1970-01-01
    • 2018-09-15
    • 2017-06-03
    • 2014-04-09
    • 2013-05-04
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多