RSpec如何打开?

gaq*_*qzi 8 ruby testing rspec

我一直在尝试open使用open-uri版本,而且我没有成功.

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

Kernel.should_receive(:open).and_return("Whatever for now")
Run Code Online (Sandbox Code Playgroud)

我也尝试过

OpenURI::OpenRead.should_receive(:open).and_return("Whatever for now")
Run Code Online (Sandbox Code Playgroud)

自从我跟踪了在OpenURI中发出HTTP请求的地方.

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

bon*_*iii 12

这就是我的工作

class Gateway

  def do_something
    open('http://example.com').read
  end

end
Run Code Online (Sandbox Code Playgroud)

在我的规范中,我执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

  • 另外,`Gateway.any_instance.stub_chain(...)` (2认同)

gaq*_*qzi 8

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

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

如果你在一个对象的上下文中调用sleep,你应该将它存在于对象上[...]
关键是,在调用sleep的上下文中的任何"self"上存根.

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

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
Run Code Online (Sandbox Code Playgroud)