我读了一些代码,例如:
source = URI.join(uri).read
这基本上是转到 URI,并将网页的源存储在变量中。
我在 IRB 中试过这个:
URI.join(uri).class
它返回了URI::HTTP
,但是,当我尝试时URI.join(uri).read.class => String
。
我检查了String
课程,但那里没有read
方法。
我想存根这个方法,但不能,因为我不知道它来自哪里。
我读了一些代码,例如:
source = URI.join(uri).read
这基本上是转到 URI,并将网页的源存储在变量中。
我在 IRB 中试过这个:
URI.join(uri).class
它返回了URI::HTTP
,但是,当我尝试时URI.join(uri).read.class => String
。
我检查了String
课程,但那里没有read
方法。
我想存根这个方法,但不能,因为我不知道它来自哪里。
read
来自 Ruby 的StringIO模块,它的作用类似于普通的IO类。
OpenURIread
通过StringIO类提供,这就是它欺骗我们和我们的代码的方式,让我们认为 URL 是我们可以读取的设备。
URI.join(uri).read.class
返回String
是因为该页面是从 URL 指向的站点读取的,并且内容是一个字符串。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>
而不是存根URI.read()
(由 OpenURI 提供,如Tin Man's answer 中所述),考虑使用像WebMock这样的库,它可以拦截 HTTP 请求,而不管用于制作它们的确切机制。