gpt4 book ai didi

ruby - 断言在 mock 上没有调用任何方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:24:16 26 4
gpt4 key购买 nike

我正在使用 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 而无需调用传入(模拟)类的任何内容。有没有办法表达这个?

背景:在我的例子中,注入(inject)的类执行昂贵的操作,因此应该为相同的查询缓存结果。

更新
感谢到目前为止的建议,也许我只是在假设错误的事情,或者我想要的甚至没有意义。我实现缓存的方法是在 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 之后,注入(inject)的类不再被调用(既不是 :expensive_method 也没有别的)。

最佳答案

指定缓存的常规方法是在调用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,因为它会自动发生。

关于ruby - 断言在 mock 上没有调用任何方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4346922/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com