如何测试使用 mechanize 的 ruby​​ 应用程序

2024-01-03

我编写了一个使用 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(使用前将#替换为@)

如何测试使用 mechanize 的 ruby​​ 应用程序 的相关文章

随机推荐

  • 如何使用tensorflow.js面部地标检测模型获取面部的特定标志,例如嘴唇或眼睛

    我正在尝试改变眼睛和嘴唇的形状和位置 为此我使用tenserflow js人脸特征点检测模型 https github com tensorflow tfjs models tree master face landmarks detect
  • Webpack 4 – 简单的 js 功能在捆绑文件后不起作用

    我对 webpack 还比较陌生 我试图让一个简单的架构发挥作用 但似乎无法找出问题所在 我将尝试总结我的代码 package json 文件 devDependencies babel preset env 7 8 3 babel loa
  • cv2.kmeans 在 Python 中的用法

    我正在考虑使用 OpenCV 的 Kmeans 实现 因为它说更快 现在我使用包 cv2 和函数 kmeans 我无法理解参考文献中参数的描述 Python cv2 kmeans data K criteria attempts flags
  • 日期格式随 DT 和闪亮而变化

    我的问题是当我在计算机和服务器上使用数据表时formatDate在改变 我知道我正在使用method toLocaleDateString 也许这不是好方法 在我的电脑上它给了我我想要的格式 1 f vrier 2000 21 mars 2
  • 2 个 Firefox 附加组件之间的通信(跨扩展通信)

    如何在 2 个 Firefox 附加组件之间传递数据和消息 Google Chrome 的方式是这样的 here http code google com chrome extensions messaging html external
  • 我可以在 Sonata Admin 控制器中使用 prePersist/preUpdate 来保存多个对象吗?

    我有这个Alias entity use Gedmo Timestampable Traits TimestampableEntity class Alias use IdentifierAutogeneratedTrait use Tim
  • HttpURLConnection.getResponseCode() 在第二次调用时返回 -1

    当我使用的库 路标 1 1 SNAPSHOT 与远程服务器建立两个连续连接时 我似乎在 Android 1 5 上遇到了一个特殊问题 第二个连接总是失败并显示HttpURLConnection getResponseCode of 1 这是
  • AS3:合并 XML 文件

    这里有很多关于将 XML 与 Java 合并的帖子 但我似乎找不到任何针对同一任务的 Actionscript 参考 我有一组需要加载的 XML 文件 我希望它们在内存中排序为一个 XML 对象 例如 假设这些是我的 XML 文件 File
  • Spark SQL - gzip、snappy 和 lzo 压缩格式之间的区别

    我正在尝试使用 Spark SQL 来编写parquet file Spark SQL 默认支持gzip 但它也支持其他压缩格式 例如snappy and lzo 这些压缩格式有什么区别 压缩率 GZIP 压缩比 Snappy 或 LZO
  • 如何正确使用JVM -XX:MaxRAM选项? [复制]

    这个问题在这里已经有答案了 我使用以下参数运行 java 应用程序 bin bash export JVM OPTS XX MaxRAM 150m export JVM OPTS JVM OPTS XX UseSerialGC java J
  • 如何更改 IntelliJ 中所有模块的语言级别

    我有一个包含许多模块的项目 我们正在升级到 Java7 我希望我的编辑器能够反映这一点 现在我的所有模块都专门将语言级别设置为Java6 并且模块太多 我无法为每个模块更改此设置 如何将所有模块设置为 Java7 更好的是 如何设置所有模块
  • SharedPreferences 替换数据

    我有一个应用程序 每当我按下按钮时都会给我一些字符串 然后使用共享首选项保存该值 但是 我想限制此保存功能 因此它只会保存最后三个收到的字符串 其结构如下 字符串A 字符串 B 字符串 C 下次当我单击按钮时 它将将该值记录到字符串 A 中
  • Python:如何从列表中检查字符串中的子字符串? [复制]

    这个问题在这里已经有答案了 如何检查字符串中列表中包含的子字符串 例如检查字符串是否包含 字符串 列表中的元素 https stackoverflow com questions 500925 但是在 Python 中呢 试试这个测试 an
  • Lambda 表达式的代码覆盖率

    我在整个代码中看到一种模式 其中 lambda 表达式显示为未包含在代码覆盖范围内 调试器确实单步执行代码并且没有条件块 public CollectionModel List
  • Ocaml 变体类型

    无论我读什么教程 手册 OCaml 类型总是让我感到困惑 我需要定义一个类型 比如说测试 它包含以下形式 具有以下形式之一的类型 a b 测试 空 T t N n Seq x1 xn 我知道如何做前 3 个 但我完全不知道如何定义最后一个形
  • 从 git 标签获取版本(通过 pbr)

    I use pbr https pypi python org pypi pbr用于包装 它从 git 标签获取版本并将其应用于 setup py 现在我还想在包中提供可用的版本 例如有一个 version 属性 我可以使用pbr图书馆为此
  • Ionic 3:从 PlayStore 链接获取价值

    我有一个 Ionic 3 应用程序 我想根据 Playstore 的下载链接在其中设置一些变量 例如 http linktoplaystore com app account 4会将我的应用程序内的帐户变量设置为 4 有什么方法可以实现此目
  • CasperJS 将数据传回 PHP

    PHP 正在使用 CasperJS 调用exec 命令 CasperJS 完成检索网页部分内容等工作后 如何将检索到的数据返回给 PHP 我认为将数据从 CasperJS 传输到另一种语言 例如 PHP 的最佳方法是将 CasperJS 脚
  • 如何调试使用 Chrome/WebKit 作为远程调试器运行的 Node.js 服务器?

    如果你的节点正在运行 node debug server js 这给了我一个端口号 xxxx 我应该在启动 Chrome 时使用这个端口号吗 您是否从远程调试它Google Chrome remote debugging port xxxx
  • 如何测试使用 mechanize 的 ruby​​ 应用程序

    我编写了一个使用 Mechanize 遍历站点的小程序 我想为它编写测试 但不希望它在每次运行测试时都实际登录到该网站 我想模拟互联网 以便当它访问某个站点时 它只是返回存储的结果 这是一个小例子 假设我的代码的目的是从谷歌主页上提取链接