代码之家  ›  专栏  ›  技术社区  ›  Joshua Cheek

如何测试使用机械化的Ruby应用程序

  •  18
  • Joshua Cheek  · 技术社区  · 15 年前

    我写了一个小程序,使用机械化遍历一个站点。

    我想为它编写测试,但不希望每次运行测试时它都实际登录到站点上。我想模拟互联网,这样当它进入某个站点时,它只返回存储的结果。

    下面是一个小例子,假设我的代码的目的是从谷歌主页上提取链接,所以我编写了一个测试,以确保我的代码找到的第一个链接具有文本“images”。我可以这样写:

    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
    

    我如何模拟google.com,这样我就可以测试我的代码来找到链接而不需要 事实上 访问互联网?

    谢谢 -乔希

    3 回复  |  直到 11 年前
        1
  •  36
  •   Paul Alexander    11 年前

    使用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将返回您保存的带有内容类型标题集的页面,以一种机械化认为它可以成功访问Internet的方式。确保设置了Content_-Type头,因为否则Mechanicy将响应视为Mechanicy::File而不是Mechanicy::Page。您可以通过在未插上网络连接的情况下在计算机上运行测试来测试它是否完全正常工作。

    另外,我是在被问到这个问题6个月后才回答这个问题的,因为这是谷歌的最高结果,但还没有回答。我自己花了30分钟来解决这个问题,我想我会分享解决方案。

        2
  •  2
  •   nas    15 年前

    如果你在写单元测试,那么你看的是错误的部分,你不需要模拟google.com,但是你应该模拟/存根机械化对象,即创建机械化对象,用参数对对象调用get方法。 http://www.google.com .是的,您确实需要通过访问页面来测试您正在对结果执行的操作,您可以通过存根响应轻松地执行该页面,然后执行所有测试。例如,如果您正在使用摩卡,那么

    mechanize = stub('WWW::Mechanize')
    WWW::Mechanize.stubs(:new).returns(mechanize)
    mechanize.stubs(:get).with('http://www.google.com').returns('What ever out put you are expecting so that you can test')
    

    我不认为你真的需要测试你的请求是否进入google.com,因为已经在mechanicgem中测试过了。

    另一个注意事项是,如果您正在进行集成/黄瓜测试,那么您可以使用Sinatra来伪造站点。Sinatra使编写单页脚本和将该脚本作为网站运行变得非常容易。

    编辑:

    如果您不使用Mocha,那么您需要安装它并在测试中要求它

    sudo gem install mocha
    

    在你的测试中

    require 'rubygems'
    require 'mocha'
    
        3
  •  1
  •   Wayne Conrad    15 年前

    如果您正在编写功能测试,并且服务器不需要任何花哨的东西,那么您可以编写一个只为测试运行的小HTTP服务器;测试代码将测试中的代码配置为与本地主机上的小HTTP服务器联系:。

    我推荐你 WEBrick . 安装一个HTTP服务器是一个快照。