ruby – 断言在模拟上没有调用任何方法
发布时间:2020-12-17 03:52:00 所属栏目:百科 来源:网络整理
导读:我正在使用Flexmock模拟框架用Rspec2编写测试.我希望我的一种方法可以缓存结果,并希望用我的模拟验证这一点. describe SomeClass do before do @mock = flexmock() end after do @mock.flexmock_verify() end it "method caches results" c = SomeClass.new(
我正在使用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 如果我想确保:forever_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也不是其他任何东西). 解决方法
指定缓存的传统方法是在调用方法之前说@ mock.should_receive(:expensive_method).once,然后调用调用它两次的方法.
我还想为此使用两个示例:一个用于指定它如何使用数据,一个用于指定它仅检索一次数据: describe Client do let(:service) { flexmock() } let(:client) { Client.new(service) } it "uses data retrieved from service" do service.stub(:expensive_method).and_return('some data') client.method.should eq('some data') end it "only retrieves the data once" do service.should_receive(:expensive_method).once client.method client.method end end 此外,您无需调用flexmock_verify,因为这会自动发生. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |