RSpec如何打开?

我一直试图open ,开放的uri版本,我没有成功。

我已尝试执行以下操作,但请求仍在继续:

 Kernel.should_receive(:open).and_return("Whatever for now") 

我也尝试过

 OpenURI::OpenRead.should_receive(:open).and_return("Whatever for now") 

自从我追踪到了在OpenURI中发出HTTP请求的地方。

在此先感谢您的任何建议!

这就是我做的

 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 

经过一段时间在Google上我找到了Stack Overflow的解决方案(我不敢相信我之前没有发现这个)。

从这里解释并由Tony Pitluga撰写 (不可链接)。

如果你在一个对象的上下文中调用sleep,你应该将它存放在对象上[…]
关键是,在调用睡眠的上下文中对任何“自我”进行存根hibernate。

所以我做了这一切,这一切都成功了:

 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 

我建议使用一些东西来代替网络。 我相信目前最喜欢的是FakeWeb [ docs ]。 您可能也对rspec的fakeweb-matcher感兴趣。


唉,我认为FakeWeb可能不适用于open() ,实际上,它存根Net::HTTP ,所以我不确定它是否会起作用。 有没有机会不使用open() ? 🙂