我正在使用 Flexmock 模拟框架使用 Rspec2 编写测试。我希望我的一种方法可以缓存结果,并希望用我的模拟来验证这一点。
describe SomeClass do
before do
@mock = flexmock()
end
after do
@mock.flexmock_verify()
end
it "method caches results"
c = SomeClass.new(@mock)
c.method
@mock.should_receive(:expensive_method).never
c.method.should == ['A']
end
end
如果我想确保:expensive_method
永远不会调用它,这很有效。但是,我希望我的班级能够在:method
不调用传入(模拟)班级的任何内容的情况下做。有没有办法表达这个?
背景:在我的例子中,注入的类执行昂贵的操作,因此应该为相等的查询缓存结果。
更新
感谢到目前为止的建议,也许我只是在假设错误的事情,或者我想要的甚至没有意义。我实现缓存的方式是保存一个类变量SomeClass
并将其添加到:method
:
def SomeClass
@@cache_map = {}
def method
# extract key
return @@cache_map[key] if @@cache_map.has_key?(key)
# call :expensive_method to get result
@@cache_map[key] = result
return result
end
end
现在,为了测试正确的缓存,我必须:extensive_method
至少调用一次来加载缓存。我喜欢 David Chelimsky 的解决方案,但它并没有回答我的初衷,即:测试在第一次调用SomeClass.method
注入的类之后不再调用(也:expensive_method
没有其他任何东西)。