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来自 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>
于 2013-01-18T20:42:54.643 回答
0

而不是存根URI.read()(由 OpenURI 提供,如Tin Man's answer 中所述),考虑使用像WebMock这样的库,它可以拦截 HTTP 请求,而不管用于制作它们的确切机制。

于 2021-04-13T22:42:42.703 回答