1

私は次のようなコードを読みました:

source = URI.join(uri).read

これは基本的にURIに行き、ウェブページのソースを変数に保存します。

私はこれをIRBで試しました:

URI.join(uri).class

戻ってきましURI::HTTPたが、やってみたらURI.join(uri).read.class => String

Stringクラスをチェックしましたが、readメソッドがありません。

このメソッドをスタブしたいのですが、どこから来たのかわからないため、スタブできません。

4

2 に答える 2

2

read通常のIOクラスのように機能するRubyのStringIOモジュールからのものです。

OpenURIは、 StringIOreadクラスを介して提供します。これは、URLが読み取り可能なデバイスであると考えるように、私たちをだます方法です。

URI.join(uri).read.classStringURLが指すサイトからページが読み取られ、コンテンツが文字列であるため、が返されます。OpenURIはURIクラスをオーバーライドし、それに追加readします。試してみると:

require 'uri'
URI.join('http://example.com').read

OpenURIを必要としないと、URI自体がその方法を知らないため、エラーが発生しますread

URI.join('http://example.com')
=> #<URI::HTTP:0x0000010292de68 URL:http://example.com>

URI.join('http://example.com').read
NoMethodError: undefined method `read' for #<URI::HTTP:0x0000010218b3b8 URL:http://example.com>
于 2013-01-18T20:42:54.643 に答える
0

スタブURI.read()ブリキの木こりの回答に記載されているようにOpenURIによって提供される)ではなく、HTTPリクエストの作成に使用された正確なメカニズムに関係なく、HTTPリクエストをインターセプトできるWebMockなどのライブラリの使用を検討してください。

于 2021-04-13T22:42:42.703 に答える