16

http リクエストを送信し、すべてのレスポンスを読み取るこの単純なコードがあります。これが私のレールコードです

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

このコード行の仕様を書くにはどうすればよいですか。モカとウェブモックを使用するオプションがありません。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

やった:

my_object.stub_chain(:open, :read) { "my return value" }
于 2013-10-15T20:48:50.183 に答える
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 に答える
1

スタブopen-uriするには、この構文を使用できますRSpec 3+

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