【问题标题】:RSpec how to stub open?RSpec如何存根打开?
【发布时间】:2010-08-30 18:46:48
【问题描述】:

我一直在尝试存根 open,即 open-uri 版本,但没有成功。

我已尝试执行以下操作,但请求一直通过:

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

我也试过了

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

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

提前感谢您的任何建议!

【问题讨论】:

    标签: ruby testing rspec


    【解决方案1】:

    这就是我的工作

    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
    

    【讨论】:

    • 我认为这是解决此类问题的好方法。谢谢你提醒我:)
    • 另外,Gateway.any_instance.stub_chain(...)
    【解决方案2】:

    在 Google 上又过了一段时间后,我在 Stack Overflow 上找到了一个解决方案(我不敢相信我以前没有找到这个)。

    解释取自 here,由 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
    

    【讨论】:

    • 不错!我认为编辑此内容并将其发布为open() 的解决方案并接受您自己的答案是合理的。存根open() 时可能很难找到sleep() 的文章。
    • 无论 self 的上下文是什么,都非常好。这帮助我解决了类似的问题,谢谢!
    • 我已经更新了你的代码。此处说明:stackoverflow.com/a/11258596/608361
    【解决方案3】:

    我建议改用一些东西来存根网络。我相信目前最喜欢这样做的是FakeWeb [docs]。您可能还对 rspec 的 fakeweb-matcher 感兴趣。


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

    【讨论】:

    • open() 非常适合代码的用途,因此直接使用 Net:HTTP 会感觉不对。 :) 我在 Google 上花了更多时间,发现另一个帮助我解决了 Stack Overflow 问题。但是感谢您的尝试!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多