我编写了一个使用 Mechanize 遍历站点的小程序。
我想为它编写测试,但不希望它在每次运行测试时都实际登录到该网站。我想模拟互联网,以便当它访问某个站点时,它只是返回存储的结果。
这是一个小例子,假设我的代码的目的是从谷歌主页上提取链接,所以我编写了一个测试以确保我的代码找到的第一个链接具有文本“图像”。我可能会写这样的东西:
require 'rubygems'
require 'mechanize'
require 'test/unit'
def my_code_to_find_links
google = WWW::Mechanize.new.get('http://www.google.com')
# ...
# some code to figure out which links it wants
# ...
google.links
end
class TestGoogle < Test::Unit::TestCase
def test_first_link_is_images
assert_equal 'Images' , my_code_to_find_links.first.text
end
end
我如何模拟 google.com 以便我可以测试 my_code_to_find_links 而无需所有开销actually访问互联网?
谢谢
-乔什
使用 Fakeweb 来消除互联网响应。
对于 Google 示例,首先访问网站并保存所需页面的 html。在这种情况下,我们假设您通过浏览器或curl保存了www.google.com。将 Fakeweb gem 添加到您的 test.rb 文件中
那么你的代码是
stream = File.read("saved_google_page.html")
FakeWeb.register_uri(:get,
"http://www.google.com",
:body => stream,
:content_type => "text/html")
当您执行标准机械化调用时
agent = Mechanize.New
page = agent.get("http://www.google.com/")
Fakeweb 将返回您保存的带有 content_type 标头的页面,Mechanize 会认为它已成功访问互联网。确保设置了 content_type 标头,否则 Mechanize 会将响应视为 Mechanize::File 而不是 Mechanize::Page。您可以通过在拔掉网络连接的情况下在计算机上运行测试来测试它是否完全正常工作。
附注我在问题提出 6 个月后回答这个问题,因为这是 Google 的最高结果,但尚未得到答复。我自己花了 30 分钟解决这个问题,并认为我应该分享解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)