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()
? 🙂