【问题标题】:Mechanize with FakeWeb使用 FakeWeb 进行机械化
【发布时间】:2009-12-09 08:33:13
【问题描述】:

我正在使用 Mechanize 从页面中提取链接。 为了简化开发,我使用 fakeweb 进行超快速响应,以减少每次代码运行时的等待和烦人。

tags_url = "http://website.com/tags/"
FakeWeb.register_uri(:get, tags_url, :body => "tags.txt")

agent = WWW::Mechanize.new
page = agent.get(tags_url)
page.links.each do |link|
   puts link.text.strip
end

当我运行上面的代码时,它说:

nokogiri_test.rb:33: undefined method `links' for #<WWW::Mechanize::File:0x9a886e0> (NoMethodError)

检查页面对象的类后

puts page.class # => File

如果我不伪造 tags_url,它可以工作,因为页面类现在是 Page

puts page.class # => Page

那么,如何使用带有 mechanize 的 fakeweb 来返回 Page 而不是 File 对象?

【问题讨论】:

  • 如果您将答案接受度保持在这么低的水平,人们就会远离您的问题。

标签: ruby-on-rails ruby mechanize


【解决方案1】:

使用 FakeWeb 重放预取的 H​​TTP 请求:

tags_url = "http://website.com/tags/"
request  = `curl -is #{tags_url}`
FakeWeb.register_uri(:get, tags_url, :response => request)

agent = WWW::Mechanize.new
page = agent.get(tags_url)
page.links.each do |link|
   puts link.text.strip
end

使用 -i 标志调用 curl 将在响应中包含标头。

【讨论】:

  • 感谢您的 4 回复。但是,上面的代码不是每次运行时都会通过互联网访问真实站点吗?虽然 curl 带有选项 -i 返回标题,但我的目标不是每次都上网,所以我有点喜欢使用 FakeWeb 选项。
  • 没有。反引号中的代码会弹出并将响应存储在request 中。如果您使用 RSpec 进行测试,则将前 3 行放在 before(:all) 块中,因此该站点将被调用一次。
  • 这将命中 url,即使它是一次。费利佩的答案是正确的。
  • 没有错。只需从文件中加载一个虚假的响应,而不是反向滴答卷曲。
【解决方案2】:

你可以很容易地解决这个问题,添加选项:content_type =&gt; "text/html"你你的FakeWeb.register_uri电话

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2019-05-20
    相关资源
    最近更新 更多