【发布时间】: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结果初始化所有规范中的该变量? -
github.com/rubocop/rspec-style-guide#ambiguous-hook-scope 也不建议使用
before(:all) -
据我记得,如果它是在示例组中定义的,那么它对于这个示例组来说是本地的。
-
before(:context)在这个...嗯上下文中是相同的 :) 不鼓励这样做,因为状态可能会在示例之间泄漏,但这是你的情况正是想要的效果,不是吗?所以这是一个权衡:你要么有干净的隔离测试,但做了几次繁重的计算,或者你记住了繁重的计算并有更好的测试套件性能,但你的测试不再是孤立的......