Jos*_*eek 18 ruby testing mechanize mocking
我写了一个小程序,它使用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 liks 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
Run Code Online (Sandbox Code Playgroud)
如何模拟google.com以便我可以测试my_code_to_find_links而无需实际访问互联网的所有开销?
谢谢 - 乔什
rhh*_*rhh 36
使用Fakeweb来删除互联网响应.
对于Google示例,首先访问网站并保存所需页面的html.在这种情况下,假设您通过浏览器或卷曲保存了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")
Run Code Online (Sandbox Code Playgroud)
当您执行标准的Mechanize调用时
agent = Mechanize.New
page = agent.get("http://www.google.com/")
Run Code Online (Sandbox Code Playgroud)
Fakeweb将返回您保存的页面,其中content_type标头设置为Mechanize认为它成功访问互联网的方式.确保设置了content_type标头,否则Mechanize会将响应视为Mechanize :: File而不是Mechanize :: Page.您可以通过在拔出网络连接的情况下在计算机上运行测试来测试它是否完全正常工作.
ps我问这个问题6个月后我回答了这个问题,因为这是谷歌的最佳结果,但是没有答案.我花了30分钟自己搞清楚这一点,并认为我会分享解决方案.