代码之家  ›  专栏  ›  技术社区  ›  gaqzi

RSPEC如何打开存根?

  •  8
  • gaqzi  · 技术社区  · 15 年前

    我一直在试图阻止 open 打开的URI版本,但我没有成功。

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

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

    我也试过这么做

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

    因为我找到了在OpenUri中进行HTTP请求的地方。

    提前感谢您的建议!

    3 回复  |  直到 14 年前
        1
  •  12
  •   bonyiii    14 年前

    这是我的工作

    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
    
        2
  •  8
  •   Community Mohan Dere    9 年前

    我在谷歌(Google)上花了一段时间后,在堆栈溢出上找到了一个解决方案(我不敢相信我以前没有找到过这个)。

    解释摘自 here 写的 托尼皮特鲁加 (不可链接)

    如果在对象的上下文中调用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
    
        3
  •  1
  •   wuputah    15 年前

    我建议用一些东西来切断网络。我认为目前最喜欢这样做的是 FakeWeb [ docs ]你也可能对 fakeweb-matcher 对于RSPEC。


    唉,我想fakeweb可能不适合 open() 事实上,它是树桩 Net::HTTP 所以我不确定这是否可行。有没有机会不使用 打开() ?:)