2009-12-09 3 views
1

J'utilise Mechanize pour extraire les liens de la page. Pour faciliter le développement, j'utilise fakeweb pour faire une réponse ultra-rapide afin d'obtenir moins d'attente et d'ennui avec chaque exécution de code.Mécaniser avec 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 

Quand je lance le code ci-dessus, il est dit:

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

Après avoir inspecté la classe de l'objet page

puts page.class # => File 

Si je ne truque pas le tags_url, il fonctionne depuis la classe de page est maintenant Page

puts page.class # => Page 

Alors, comment puis-je utiliser le fakeweb avec mechanize pour retourner Page au lieu de l'objet Fichier?

+3

Si vous gardez votre niveau d'acceptation de répondre à ce peuple faible, vont rester loin de vos questions. – Geo

Répondre

7

Utilisez FakeWeb pour rejouer une requête HTTP préextraite:

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 

Appel boucle avec le drapeau -i comprendra en-têtes dans la réponse.

+0

Merci 4 réponse. Mais le code ci-dessus ne frappe-t-il pas le vrai site sur internet à chaque fois que je le lance? Bien que curl avec l'option -i retourne l'en-tête, mon objectif était de ne pas toucher internet à chaque fois, donc j'aime bien utiliser l'option FakeWeb. – Autodidact

+0

no. le code dans les backticks shells et stocke la réponse dans 'request'. Vous mettez les 3 premières lignes dans un bloc 'before (: all)' si vous testez avec RSpec, donc le site sera appelé une seule fois. –

+0

Cela va frapper l'url, même si c'est une fois. La réponse de Felipe est la bonne. – dgmora

5

Vous pouvez facilement résoudre ce problème en ajoutant l'option :content_type => "text/html" vous votre FakeWeb.register_uri appel

Questions connexes