16

我有这个简单的代码,我在其中发送 http 请求并读取所有响应。这是我的导轨代码

open("http://stackoverflow.com/questions/ask")

我如何为这行代码编写规范。我没有使用 mocha 和 webmock 的选项。我只能使用 Rpsec 的模拟框架。

我试图使用这个语句

OpenURI.stub!(:open_uri).should_receive(:open).with("http://stackoverflow.com/questions/ask")

但我不断收到此错误

RSpec::Mocks::MockExpectationError: (#<RSpec::Mocks::MessageExpectation:0xd1a7914>).open("http://stackoverflow.com/questions/ask")
expected: 1 time
received: 0 times
4

4 回答 4

19

我以为open方法是在级别上定义的Kernel,但我错了。

如果你想模拟open,你应该像这样在你的对象级别上做:

it "should do something" do
  object_under_test = ObjectUnderTest.new
  object_under_test.should_receive(:open).with("http://example.org")
end
于 2012-06-29T08:41:09.307 回答
2

根据此链接http://distillations.2rye.com/2011/08/mock-the-web-openuri/ open 函数是在内核模块上定义的,但混合到您的控制器中。因此,您需要在该级别存根调用。此解决方案适用于 RSpec 控制器测试:

  html_content = <<-EOS
          <html><head>
           <title>Some Title</title>
          </head>
          <body>Some Content</body></html>
        EOS

  YourController.any_instance.stub(:open).and_return html_content
于 2013-01-18T17:06:20.907 回答
2

我做了:

my_object.stub_chain(:open, :read) { "my return value" }
于 2013-10-15T20:48:50.183 回答
1

要存根open-uri,您可以使用此语法RSpec 3+

file = double('file')
expect(OpenURI).to receive(:open_uri).and_return(file)
于 2018-05-03T22:14:06.213 回答