RSpec:如何编写一个需要特定输出但不关心方法的测试?

2024-03-29

我正在尝试了解测试驱动设计,特别是 RSpec。但我在使用 RSpec 书中的一些示例时遇到了麻烦。

在书中,我们测试 $STDOUT 上的输出,如下所示:

output = double('output')
game = Game.new
output.should_receive(:puts).with('Welcome to Codebreaker!')
game.start()

嗯,这确实有效。但我到底为什么要关心 Game 对象是否使用 put() 方法呢?如果我将其更改为 print(),它真的会破坏测试吗?而且,更重要的是,这是否违背了 TDD 的原则之一——我应该测试方法的作用(设计)而不是方法的作用(实现)?

有什么方法可以编写一个测试来测试 $STDOUT 上最终的内容,而不查看什么方法将其放在那里?


创建一个能够写出状态的显示类。

您的生产代码将使用此显示对象,因此您可以自由更改写入 STDOUT 的方式。当您的测试依赖于抽象时,该逻辑将只有一个位置。

例如:

output = stub('output')
game = Game.new(output)
output.should_receive(:display).with('Welcome to Codebreaker!')
game.start()

虽然您的生产代码将包含诸如

class Output
  def display(message)
    # puts or whatever internally used here. You only need to change this here.
  end
end

我将通过执行以下操作来使此测试通过:

def start
  @output.display('Welcome to Codebreaker!')
end

这里的生产代码并不关心输出如何显示。现在抽象已经到位,它可以是任何形式的显示。

上述所有理论都与语言无关,并且很有效。您仍然模拟您不拥有的东西,例如第三方代码,但您仍在测试您是否通过抽象来执行手头的工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RSpec:如何编写一个需要特定输出但不关心方法的测试? 的相关文章

  • 地图、每个和收集之间有什么区别? [复制]

    这个问题在这里已经有答案了 在 Ruby 中 功能之间有什么区别吗 each map and collect each不同于map and collect but map and collect是相同的 技术上map是一个别名collect
  • ActiveRecord oracle_enhanced 适配器无法加载 ruby​​-oci8 库

    rails g scaffold失败 但 oci 脚本和 irb 数据查询有效 无法弄清楚出了什么问题 rails g scaffold table field1 integer field2 string invoke active re
  • 可以在哈希每个循环中访问索引吗?

    我可能遗漏了一些明显的东西 但是有没有办法访问哈希每个循环内迭代的索引 计数 hash three gt one four gt two one gt three hash each key value any way to know wh
  • Ruby:如何计算相对于另一条路径的路径?

    假设我知道我开始的绝对路径和我试图到达的绝对路径 first first path second second path 现在我想弄清楚如何构建一条相对于第一个路径 例如 answer should be first path second
  • 从 ActiveRecord 获取表名

    I used ActiveRecord Base set table name在动态创建的 ActiveRecord 类上设置我的表名称 现在我需要知道稍后如何获得该值 api 文档没有提及如何执行此操作 另外 我无法从 ActiveRec
  • 使用 sinon 对 ES6 原型方法进行存根

    我在使用 Sinon 存根超类的原型方法时遇到问题 在下面的示例中 我将对超类方法 GetMyDetails 的调用进行存根处理 如下所示 我确信有更好的方法 actor sinon stub student proto proto Get
  • 回形针如何更改基本名称(文件名)?

    我正在尝试更改照片的基本名称 文件名 在我的模型中我有 attr accessor image url basename has attached file image styles gt original gt 300x250 gt pn
  • 在 Rails 4 中渲染部分/rake 任务/后台作业/模型中的视图

    我读过很多关于在 rake 任务 后台作业 模型中渲染 Rails 部分和视图的内容 我在 Stackoverflow 和网络上找到的绝大多数内容都描述了在 Rails 3 中工作的方法 但它们似乎已经过时了 而且我没有让它们工作 即使花了
  • 如何检查水豚中的复选框?

    我正在使用 Rspec 和水豚 我怎样才能写一个步骤来检查checkbox 我试过了check按价值但它找不到我的checkbox 我不知道该怎么做 因为我实际上有相同的 ID 但值不同 这是代码
  • 如何让 Sinatra 通过 HTTPS/SSL 工作?

    正如标题所示 谷歌没有提供任何与此相关的有用信息 如何为 Sinatra 应用程序设置和配置 HTTPS SSL 如何创建 HTTPS 路由 我以前从未在我的应用程序中使用过 HTTPS 也没有调整 Rack 其他内容的经验 所以我很欣赏详
  • 在 ruby​​ 中读/写受密码保护和加密的文件

    我想加密一个 ruby 程序将从中加载数据的文件 此外 我需要程序在启动时提示输入密码 该密码将用于解密文件 换句话说 该文件需要加密地驻留在计算机上 只有拥有密码的用户才能运行该应用程序 我已经开始研究 openpgp 但据我了解 这仍然
  • Capybara 的 has_selector 有哪些选项?

    我在 RSpec 中遇到此错误 有没有任何文档have selector解释了选项哈希中的每个键以及它到底有什么作用 invalid keys content should be one of text visible between co
  • nodejs mocha suite 未定义错误

    我正在尝试使用摩卡运行一些测试 但似乎无法克服这个错误 E tdd nodejs cart gt mocha cart test js node js 201 throw e process nextTick error or err Re
  • ruby 的 String .hash 方法如何工作?

    我只是红宝石的新手 我见过一个字符串方法 String hash 例如 在irb 我试过了 gt gt mgpyone hash returns gt 144611910 这个方法是如何工作的 The hash方法是为所有对象定义的 看文档
  • Ruby mp3 Id3 解析

    目前我正在从事一个音乐项目 处理用户 mp3 上传 问题是我找不到适用于所有文件的 id3 库 我努力了id3 ruby and Mp3Info库 但它们都没有给我一致正确的结果 例如 最常见的问题 错误的流参数 比特率和采样率 有时是持续
  • 使用复选框过滤列表

    我有一个电影列表及其评级 在我的页面顶部 我有一个表单 其中提供了一个复选框列表 其中显示了每个可用的评级 G PG 13 等 一旦用户单击复选框并点击提交 我只想显示所选的电影 在我的索引方法中 我有一个名为的实例变量 filtered
  • 为什么 rand() 总是返回相同的数字?

    我在用 兰特 200 在我的 Rails 应用程序中 当我在控制台中运行它时 它总是返回随机数 但如果我在应用程序行中使用它 index rand 200 索引总是相同的号码 为什么会这样以及如何克服这个问题 简单的伪随机数生成器实际上生成
  • 如何使用 Ruby on Rails 3 检查 HTTP 请求的“Content-Length”字段?

    我正在使用 Ruby on Rails 3 在我的视图文件中我有以下代码 为了避免服务器过载 我会在服务器接收上传文件之前检查上传文件的大小 这是因为 按下表单的提交按钮 服务器会先完整接收文件 然后再检查文件 我知道一个HTTP 请求有标
  • 有没有办法使用 Rspec/Capybara/Selenium 将 javascript console.errors 打印到终端?

    当我运行 rspec 时 是否可以让 capybara selenium 向 rspec 报告任何 javascript console errors 和其他异常 我有一大堆测试失败 但当我手动测试它时 我的应用程序正在运行 如果不知道仅在
  • 用于验证目的的动态查找方法

    我正在使用 Ruby on Rails 3 0 7 我想在运行时查找一些记录以进行验证 但为该查找方法传递 设置一个值 也就是说 在我的班级中 我有以下内容 class Group lt lt ActiveRecord Base valid

随机推荐