我一直在尝试使用open-uri版本open
,但我没有成功。
我已尝试执行以下操作,但请求仍在继续:
Kernel.should_receive(:open).and_return("Whatever for now")
我也试过
OpenURI::OpenRead.should_receive(:open).and_return("Whatever for now")
因为我追踪到了在OpenURI中发出HTTP请求的地方。
提前感谢任何建议!
答案 0 :(得分:12)
这是我做的事情
class Gateway
def do_something
open('http://example.com').read
end
end
在我的规范中,我执行以下操作:
describe 'communication' do
it 'should receive valid response from example.com' do
gateway = Gateway.new
gateway.stub_chain(:open, :read).and_return('Remote server response')
gateway.do_something.should == "Remote server response"
end
end
答案 1 :(得分:8)
我在Google Overflow上找到了一个解决方案,经过一段时间在谷歌(我不相信我之前没有发现这个)。
来自here并由 Tony Pitluga 撰写的解释(不可链接)。
如果您在对象的上下文中调用sleep,则应将其存储在对象[...]上 关键是,在调用睡眠的环境中对任何“自我”进行存根休眠。
所以我这样做了,一切都成功了:
let(:read) { mock('open') }
it "should return the new log-level when the log level was set successfully" do
read.stub(:read).and_return('log-level set to 1')
kannel.should_receive(:open).and_return(read)
kannel.set_log_level(1).should == 1
end
答案 2 :(得分:1)
我建议使用某些东西来存根网络。我相信目前最喜欢的是FakeWeb [docs]。您可能也对rs fakeweb-matcher感兴趣。
唉,我认为FakeWeb可能无法与open()
一起使用,实际上,它存根Net::HTTP
,因此我不确定这是否有效。是否有机会不使用open()
? :)