如何重置对模拟类方法的期望?

2024-04-14

抱歉,如果这很简单。我对 ruby​​ 和 rspec 都是新手,似乎 rspec 是一个非常“晦涩”的世界(特别是来自 .net 背景时)。

在我的“规范”中,我有:

before(:each) do
    expect(File).to receive(:exist?).with("dummy.yaml").and_return (true)
end

这对于我所有的“示例”都适用,除了我希望它返回 false 的示例。

expect(File).to receive(:exist?).with("non_existent.yaml").and_return (false)

这显然失败了我的测试,因为尽管满足了“non_existent.yaml”期望,但“dummy.yaml”却没有:

(<File (class)>).exist?("dummy.yaml")
       expected: 1 time with arguments: ("dummy.yaml")
       received: 0 times

那么我怎样才能对“File.exist”进行“重置”呢? (类方法模拟)在我设置新的期望之前? (...“non_existent.yaml”..)

我用谷歌搜索,结果是:

RSpec::Mocks.proxy_for(your_object).reset

但这给了我:

NoMethodError:
   undefined method `proxy_for' for RSpec::Mocks:Module

我在文档中找不到任何地方可以说明您应该如何执行此操作,并且过去的行为表明该解决方案将来也可能会发生变化,但显然这是您当前可以执行的操作:

RSpec::Mocks.space.proxy_for(your_object).reset

不过,我会遵循 @BroiSatse 的评论,并考虑重新设计测试,旨在将期望从before堵塞。这before正如你所说,块是用于设置的,而设置是一个非常奇怪的放置期望的地方。

我不确定你是如何想到这个设计的,但我可以建议两种可能的替代方案:

  • 如果测试很简单,并且无论如何都会工作,那么您应该创建一个具有这一明确期望的测试,同时将其存根用于其他测试:

    before(:each) do
      allow(File).to receive(:exist?).with("dummy.yaml").and_return (true)
    end
    
    it "asks if file exists" do
      expect(File).to receive(:exist?).with("dummy.yaml").and_return (true)
      # do the test...
    end
    
  • 如果期望应该针对每个测试运行,因为每个场景中的变化是context,你应该考虑使用分享的例子 https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-examples:

    shared_examples "looking for dummy.yaml" do 
      it "asks if file exists" do
        expect(File).to receive(:exist?).with("dummy.yaml").and_return (true)
        # do the test...
      end
    end
    
    it_behaves_like "looking for dummy.yaml" do 
      let(:scenario) { "something which sets the context"}
    end
    

您可能还想问迈伦 https://github.com/rspec/rspec-mocks/issues/new如果有更推荐/记录的解决方案来重置模拟对象......

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

如何重置对模拟类方法的期望? 的相关文章

  • Rails 中的 PDF 导出

    我需要将包含一些图表的 HTML 页面导出为 PDF 有哪些好的 gem 可以做到这一点 PDFKit http railscasts com episodes 220 pdfkit http railscasts com episodes
  • “没有可用的二元红宝石”是什么意思?

    每当我使用rvm install x x x 即使安装成功 我也会收到此警告 No binary rubies available for osx 10 12 x86 64 ruby 2 4 0 Continuing with compil
  • 如何在 Rails 控制器中调用通道方法?

    我有一个订阅用户的 ActionCable 方法 如果启动新的 convo 我也希望用户订阅新频道 我无法找出在控制器中调用通道方法的正确语法 更新 问题是消息在发送时附加到聊天框 但是当发送第一条消息时 Websocket 连接尚未建立
  • Ruby 中的并行赋值运算符

    我正在查看 Ruby 编程 书中的一个示例 def fib up to max i1 i2 1 1 parallel assignment i1 1 and i2 1 while i1 lt max yield i1 i1 i2 i2 i1
  • 有没有人有 Ruby 和 Rake 的 Notepad++ 函数列表插件的解析规则

    我使用 Notepad 编辑 rake 文件 并且希望能够使用函数列表插件 我无法在线找到任何解析规则 并且 语言解析规则 对话框没有非常清晰的记录 我正在将方法解析到以下列表中 但还想显示任务 Function Begin t def t
  • Rails:CSRF 令牌不工作但已设置

    我在 Heroku 上有我的 Rails 3 应用程序 当我发送银行信息时 我得到 WARNING Can t verify CSRF token authenticity但我的 CSRF 令牌已设置 https gist github c
  • 茉莉花单元测试 - 测试对象的未定义属性

    我有以下声明 expect A BAR name toEqual foo 由于我的对象 A 具有顶级属性 BAR 并且 bar 具有值 foo 传递 我想测试我的结构以确认属性 NONEXISTINGPROP 尚未定义 例如 expect
  • 如何向 Time.now 添加两周?

    如何在 Ruby 中向当前 Time now 添加两周 我有一个使用 DataMapper 的小型 Sinatra 项目 在保存之前 我有一个字段填充了当前时间加上两周 但未按需要工作 任何帮助是极大的赞赏 我收到以下错误 NoMethod
  • 在 Android 中跨单元测试和仪器测试共享资源

    现在谷歌已经添加了实验单元测试支持 http tools android com tech docs unit testing support 如何在单元测试和仪器测试之间共享资源 例如 假设我有一个TestUtils java我希望在单元
  • Watir 更改 Mozilla Firefox 首选项

    我正在使用 Watir 运行 Ruby 脚本来自动执行一些操作 我正在尝试自动将一些文件保存到某个目录 因此 在我的 Mozilla 设置中 我将默认下载目录设置为桌面并选择自动保存文件 然而 当我开始运行脚本时 这些更改并未反映出来 似乎
  • Rails 4:资产未在生产中加载

    我正在尝试将我的应用程序投入生产 但图像和 CSS 资源路径不起作用 这是我目前正在做的事情 图像资源位于 app assets images image jpg 样式表位于 app assets stylesheets style css
  • 使用 attr_accessor 动态创建类属性

    在Ruby中 有没有办法动态地将实例变量添加到类中 例如 class MyClass def initialize create attribute name end def create attribute name attr acces
  • 与 Dagger 一起使用时,Espresso 生成 FileNotFoundException

    我一直在研究旧版 Android 应用程序 尝试为其添加测试和适当的架构 该应用程序有一个主要LaunchActivity它在启动时运行一系列检查 最初 该活动使用 Dagger 来 注入依赖项 活动将使用它来运行检查 但效果相当糟糕 我转
  • Nokogiri 保持 HTML 实体不变

    我希望 Nokogiri 保持 HTML 实体不变 但它似乎正在将实体转换为实际的符号 例如 Nokogiri HTML fragment p reg p to s 结果是 p p 似乎没有什么可以将原始 HTML 返回给我 inner h
  • Rails - 渲染:目标锚标记的操作?

    我希望像这样使用渲染 render action gt page form 我也尝试过这个 render template gt site page form 那也没用 这个特定页面上的表单位于最底部 如果提交时发生任何错误 我不希望用户被
  • 单元测试类是否应该与其余代码一起置于版本控制之下?

    如果我为开发项目创建测试套件 这些类是否应该与项目代码的其余部分一起受版本控制 是的 没有理由不将它们置于源代码管理中 如果测试发生变化怎么办 如果接口发生变化 需要测试更改怎么办
  • 使用 rspec 测试嵌套路由

    我正在尝试使用 rspec 测试路由 以下给出了 预期块返回真值 的错误 我不确定我错过了什么 通过浏览器我可以发布到这个网址并且成功 有任何想法吗 谢谢 Routes resources forum topics do resources
  • 单元测试序列化有什么要点吗?

    我有一个类 它序列化一组我想要进行单元测试的对象 使用 XML 序列化 我的问题是 感觉我将测试 XML 序列化的 NET 实现 而不是任何有用的东西 我还有一个先有鸡还是先有蛋的场景 为了测试 Reader 我需要一个由 Writer 生
  • FakeAsync/tick (Async/whenStable) 与 detectorChanges()

    您能帮我区分这两件事吗 根据我的理解 如果你只使用 observable 你可以使用 detectorChanges 因此 您可以直接更改组件属性或监视服务调用并返回可观察的值 然后调用 detectorChanges 更改将在 html
  • 通过 Web 界面执行 python 单元测试

    是否可以通过 Web 界面执行单元测试 如果可以 如何执行 EDIT 现在我想要结果 对于测试 我希望它们是自动化的 可能每次我对代码进行更改时 抱歉我忘了说得更清楚 EDIT 这个答案此时已经过时了 Use Jenkins https j

随机推荐

  • 如何在 playbook 中使用 Ansible Tower 登录凭据?

    是否可以使用我用来直接在剧本中登录 Ansible Tower 的凭据 是的 您可以通过使用 保存您的凭据 来完成此操作安西布尔塔 Ansible Tower 上的凭证类型 从 Ansible Tower UI 中 转至 Credentia
  • Perl 脚本中的大小写敏感性 - 如何使其不敏感?

    我如何更改以下马尔可夫脚本以将大写和小写单词视为相同 整个想法是帮助提高马尔可夫文本生成器的输出质量 就目前情况而言 如果您在其中插入 99 个小写句子和 1 个大写句子 您几乎总是会在输出中找到大写句子的非标记化版本 Copyright
  • 解析期间强大的库存

    当我开始使用我的应用程序上传文件时 它会在第一步后存储 上传功能代码如下 exports upload function req res var form formidable IncomingForm console log Upload
  • 实体框架 4.0:错误 113:多重性在角色中无效

    我在数据库中放入了一个新表 并且有 4 个表与其有外键关系 我以为我以相同的方式配置了所有 4 个 但我收到此错误 错误 15 错误 113 多重性在关系 FK OtherLeaves ReportCellImages 中的角色 Repor
  • 如何在 JTSAGE 日期选择器中仅显示日期之前

    I use Jtsage http dev jtsage com jQM DateBox2 我的移动应用程序 jquery mobile 和phonegap 中的日期选择器 我只想显示今天和今天之前的日期 hide future dates
  • 如何逐像素绘制任意方向的椭圆?

    我必须逐像素绘制任意大小和方向的椭圆 绘制一个长轴和短轴与 x 轴和 y 轴对齐的椭圆似乎很容易 但将椭圆旋转任意角度似乎更棘手 最初 我认为绘制未旋转的椭圆并对每个点应用旋转矩阵可能会起作用 但似乎这可能会导致舍入错误 而且我需要相当高的
  • C 中函数指针的初始化

    我有这个功能 uint8 t Authorization getRole char const userId UsertoRole T const roleTable 在主程序中我有 given Role Authorization get
  • 如何在另一个类中访问一个类的成员函数?

    我无法访问另一个类中一个类的成员函数 尽管我可以在 main 中很好地访问它 我一直在尝试扭转局面 但无法理解我做错了什么 任何帮助 将不胜感激 这是生成错误的行 cout lt lt n nRetrieve key from inside
  • Github 存储库 - LockFile 存在

    我最近尝试通过 GitHub Desktop 提交到我的存储库 并被告知有一个锁定文件阻止我这样做 我不记得上传过这个锁定文件 也不知道它来自哪里 可能有其他人同时推动吗 否则 只需尝试存储更改 移动到另一个分支 返回 应用存储并再次推送
  • Unity / RIDER:乘法运算的顺序效率低下?

    骑手 IDE 告诉我以下操作效率低下 transform Translate moveDirection speed Time smoothDeltaTime 并想将其重写为 transform Translate Time smoothD
  • 在javascript中获取元素的xpath

    我正在使用 javascript 进行开发 我需要获取单击的元素的 xpath 我知道为了获得 id 我们可以这样做 element onclick function event var target id event target id
  • 为什么 schema_translate_map 不更改架构?

    我正在尝试使用schema translate map更改架构 Base declarative base class DataAccessLayer def init self conn string mysql mysqlconnect
  • 实体框架 7 SaveChanges

    有没有办法注册一个回调 该回调将在 EF7 中的模型保存到数据库之前调用 我想要做的是设置所有模型上的 ModifiedBy 和 ModifiedDate 属性 我不太热衷于在每次保存之前手动执行此操作 因此我正在寻找一些更通用和自动的方法
  • 为什么https只能用于登录?

    性能是唯一的问题吗 不能在整个用户会话期间使用 https 连接吗 显然重定向发生的情况较少 我发现这个相关问题http 与 https 性能对比 https stackoverflow com questions 149274 http
  • SHTML 的目的和独特性是什么?

    最近 当我看到一个带有 shtml 扩展名的网站时 我开始了解 SHTML SHTML 的目的是什么 它与 HTML 和 DHTML 有何不同 SHTML 是一种文件扩展名 可让 Web 服务器知道应使用服务器端包含 SSI 来处理该文件
  • 我可以使用 adb shell 向我的应用程序发送命令吗

    我想找到一种方法来创建可以使用 adb shell 或类似命令发送到我的应用程序的命令 这样我就可以对程序进行一些小的更改 而不必每次更改任何内容时都重新加载应用程序 有没有办法打开 adb shell 并向正在运行的应用程序发送命令 如果
  • WCF回调接口-谁关闭通道

    我在关闭回调 双工通信通道时遇到问题 疑问 这是我的原型 WCF 接口 ServiceContract CallbackContract typeof IMyInterfaceCallback public interface IMyInt
  • 如何使用 rhino 导入其他 javascript 文件

    我一生都无法弄清楚如何在Rhino下的javascript中导入javascript文件 基本上 我想做的就是导入 some file js 并能够使用其中范围内的内容 我一直在尝试弄乱 Context currentContext com
  • Egit - 创建分支时正确设置远程跟踪

    当我使用 EGit 从远程分支创建新分支时 我得到了错误的远程跟踪设置 我从远程分支 refs heads master 创建本地分支 feature1 并立即推送到上游 在我的 git config 文件中配置以下远程跟踪 branch
  • 如何重置对模拟类方法的期望?

    抱歉 如果这很简单 我对 ruby 和 rspec 都是新手 似乎 rspec 是一个非常 晦涩 的世界 特别是来自 net 背景时 在我的 规范 中 我有 before each do expect File to receive exi