RSpec如何打开?

时间:2010-08-30 18:46:49

标签: ruby testing rspec

我一直在尝试使用open-uri版本open,但我没有成功。

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

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

我也试过

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

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

提前感谢任何建议!

3 个答案:

答案 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()? :)