首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ruby rspec:如何让存根在每次调用时都有不同的行为

在Ruby的RSpec测试框架中,如果你想要让一个存根(stub)在每次调用时都有不同的行为,你可以使用and_return方法结合块(block)或者yield关键字来实现。这样可以让你在每次调用存根时执行不同的代码逻辑。

以下是一个使用块来实现每次调用都有不同行为的例子:

代码语言:txt
复制
RSpec.describe "Stubbing with different behaviors" do
  let(:my_object) { double("MyObject") }

  it "returns different values on each call" do
    allow(my_object).to receive(:my_method) do |arg|
      # 这里可以根据传入的参数或其他条件返回不同的值
      case arg
      when 1 then "first"
      when 2 then "second"
      else "unknown"
      end
    end

    expect(my_object.my_method(1)).to eq("first")
    expect(my_object.my_method(2)).to eq("second")
    expect(my_object.my_method(3)).to eq("unknown")
  end
end

在这个例子中,my_method存根根据传入的参数返回不同的字符串值。

如果你想要在存根调用时执行一些代码并返回结果,可以使用yield关键字:

代码语言:txt
复制
RSpec.describe "Stubbing with yield" do
  let(:my_object) { double("MyObject") }

  it "yields different blocks on each call" do
    allow(my_object).to receive(:my_method) do |&block|
      # 这里可以执行传入的块,并根据需要返回不同的结果
      block.call
    end

    expect(my_object.my_method { "first" }).to eq("first")
    expect(my_object.my_method { "second" }).to eq("second")
  end
end

在这个例子中,my_method存根执行传入的块,并返回块的结果。

这些技巧可以帮助你在RSpec测试中创建更加灵活和动态的存根行为。记住,使用这些高级特性时要小心,确保你的测试仍然保持清晰和可维护。

参考链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Effective Testing with RSpec 3 (第一部分:入门)

RSpecAPI就是决定你希望代码如何表现并在你specs中表达该决定。 一旦你掌握了基础知识,我们就无法拒绝向你展示,使RSpec与众不同一些东西。...本章中,你将看到: •如何安装RSpec并编写你第一个specs •如何使用describe,和用它来组织你specs •如何验证期望结果 •如何解释测试失败 •如何使你specs不受重复设置代码影响...我们已经使用Ruby 2.4本书中测试了我们示例,并鼓励您将该版本用于最简单路径。 在其他版本Ruby上,您可能会得到略微不同结果。...是的,这很愚蠢,但它会这些例子保持简短,我们写这一章时感到很饿。 三明治最重要特性是什么? 面包? 条件? 不,关于三明治最重要是它应该味道好。 让我们用RSpec语言这么说吧。...这些术语是半可互换,但每个都有不同侧重点: •测试验证了一些代码是否正常工作。 •规范描述了一些代码期望行为。 •一个示例显示了如何使用特定API。

2K30

Effective Testing with RSpec 3(介绍)

如何使用本书 通过本书,您将分三个阶段学习RSpec 3: •第一部分:介绍练习,您熟悉RSpec •第二部分:跨越几个章节工作示例,以便您可以一个有意义大小项目中看到RSpec •第III-V...代码片段 我们本书中提供了代码片段,展示了如何在实际情况中使用RSpec。 这些示例中大多数旨在供您在计算机上使用,尤其是第I部分和第II部分中示例。...大多数章节都有一个“轮到你”部分,练习可供您试用。 不要跳过这些! 单独练习将确保每章都以您在本书中学到技能为基础。 RSpec行为驱动开发 RSpec将自己称为行为驱动开发(BDD)测试框架。...社区强调了测试中表达力重要性,我们将在本书中讨论很多内容。 BDD也是以同样关怀来处理您软件需求,因为它们是行为另一种表达。这是关于所有利益相关者参与编写验收测试。...虽然我们已经Ruby 2.2上测试了多个Ruby版本代码,但是如果您按照我们文本中提到完全相同版本,您将获得最佳体验:Ruby 2.4,RSpec 3.6等等。

2K20
  • GitLab CICD 配置指南 .gitlab-ci.yml文件配置

    GitLabCI/CD 完全是由.gitlab-ci.yml 文件内容决定 GitLabCI/CD具体内容是由.gitlab-ci.yml文件定义, 一个GitLab项目,项目根目录只有有....gitlab-ci.yml文件,并且配置了Runner,那么每次提交代码 都会触发CIpipline .gitlab-ci.yml文件是告诉GitLabrunner去做什么每次触发后,runner...不同分支,不同版本可以有不同.gitlab-ci.yml内容 不用任务 .gitlab-ci.yml 文件是使用YAML文件格式来编写,只允许空格,不允许Tabs 项目根目录创建一个文件,..."${FLAGS[@]}" rspec: script: - bundle exec rspec rubocop: script: - bundle exec rubocop...这是对大多数Ruby应用都适用简单配置 定义了两个任务 rspec和rubocop 分别会执行不同脚本 每次任务执行之前,定义before_script脚本都会先被执行 .gitlab-ci.yml

    1.1K10

    RPC、gRPC常见面试题及相关知识点

    进行服务拆分后,由于服务分布多台服务器上,所以相互之间调用需要通过网络来进行。 RPC主要目标是尽量保证提供类似本地调用简洁语义基础上,分布式应用之间通信变得更加方便和高效。...(2)随着公司规模增长,不同团队和项目使用不同语言开发,跨语言接口调用需求不断增加。 (3)分布式系统之间服务治理可以通过RPC框架解决。...(4)要实现高并发网络服务访问,传统 HTTP2 每次用时都要建立连接,对资源消耗多且效率低下。...gRPC中,客户端应用可以像调用本地方法一样直接调用另一台不同机器上服务端应用方法,使得能够更容易地创建分布式应用和服务。 gRPC无论是客户端还是服务端都可以多种语言环境中运行。...如下图所示,gRPC服务端是C++提供服务,而客户端一个是Ruby客户端,一个是Java客户端。客户端和服务端之间通过Proto请求和响应完成跨网络和跨语言访问。

    3.1K30

    GitLab CI CD管道配置参考 .gitlab-ci.yml文件定义字段

    组织 网络广播中观看“ 为CI / CD辩护”,以了解CI / CD好处以及如何衡量CI / CD自动化结果。...timeout interruptible 以下示例中,该ruby:2.5图像被设置为除rspec 2.6使用该ruby:2.6图像作业以外所有作业默认图像: default: image...: ruby:2.5 rspec: script: bundle exec rspec rspec 2.6: image: ruby:2.6 script: bundle exec rspec...使用此配置,每次推送到打开合并请求源分支都会导致重复管道。明确允许同一作业中同时使用推送和合并请求管道可能具有相同效果。 我们建议使用workflow: rules来限制允许管道类型。...它可能不会引起YAML错误,但调试确切执行行为可以是不同默认行为复杂,因为only/except和rules。

    22.2K20

    Kahlan:款革命性PHP自动化测试框架

    概述 寻找一个能够提升PHP单元测试体验工具吗?那么,Kahlan可能就是你要找答案。...Kahlan是一个功能完备单元和行为驱动开发(BDD)测试框架,它借鉴了RSpec和JSpec设计理念,引入了一种全新describe-it语法,PHP测试更加直观和高效。...介绍 Kahlan核心亮点在于无需依赖PECL扩展,就能实现类似于Ruby或JavaScript代码模拟(stubbing)和猴子补丁(monkey patching)。...这意味着你可以直接在你PHP代码上进行快速灵活测试,而不需要额外库或者配置。 技术分析 Kahlan提供了一系列强大特性,包括: RSpec/JSpec风格语法:使测试代码更简洁易读。...强大模拟系统:允许直接在被测试对象上设置模拟,简化了测试逻辑。 动态猴子补丁:可以临时修改函数或类行为,以隔离测试环境。

    15710

    开发者死后,他开源项目会有人继续维护吗?

    前文提到他给 Ruby 做了一些关键工具,包括了他给 Ruby 开发 build 工具Rake。 Weirich 离世后,Rake 已移交到 Ruby 官方。...部分原因是因为大多数公司和政府所运行都是商业软件,都有专人维护。但现在,更多程序依赖于像 Weirich 这样程序员所开发晦涩难懂但却重要开源软件。...Rspec-Given代码托管代码托管和协作站点 GitHub 上,后者目前拥有 6700 万个代码库。...Weirich GitHub 上 Rspec-Given 页面是其他 Ruby 用户报告错误或自愿帮助改进代码主要地方。...GitHub 拒绝讨论其关于转移项目控制政策。 相关方法能够解决与Rspec-Given有关潜在问题,但是它也Searls看到了许多可能出潜在问题。

    1.3K100

    “小众”之美——RubyQA自动化中应用

    自身应该算是“纯粹”测试人员,“测试开发”这重职业并不普及年代,一直希望有种语言可以测试开发效率超过研发,Ruby做到了。 人性化语法,各种糖。...通过ci_reporter,可以方便地将Rspec报告格式转为JUnitXML格式,Jenkins中做对应展示。 ?...解决接口多版本测试例子 移动端API自动化中存在问题就是,一个接口会存在多个版本并存情况,有header中内容不同,或formdata内容不同情况,接口回归中必须都要照顾到,Coral-API...答案就是JRuby + Java反射调用,Pigeon接口中我们已经试点了这种方式,证明是可行,针对不同RPC框架实现不同Adapter(Jar文件),Coral-API传参(JSON格式)给...,Session、Cookie、安全密码、邮件地址校验都有对应gem,感觉不像是写代码,更像是配置项目,不知不觉,一个系统雏形就完成了,整理了下项目中使用到gem,主要有以下这些。

    1.8K30

    用 GitLab 做 CICD 是什么感觉,太强了!!

    持续交付和部署相当于更进一步CI,可以每次推送到仓库默认分支同时将应用程序部署到生产环境。...它涉及到每次迭代中就不断地构建、测试和部署代码更改,从而减少了基于已经存在bug或失败先前版本开发新代码机会。...GitLab CI/CD 是如何工作 为了使用GitLab CI/CD,你需要一个托管GitLab上应用程序代码库,并且根目录中.gitlab-ci.yml文件中指定构建、测试和部署脚本。...二者共同构成了每次推送到仓库任何分支时都会被触发pipeline(管道)。 GitLab CI/CD不仅可以执行你设置job,还可以显示执行期间发生情况,正如你终端看到那样: ?...,并一定比例用户群通过Canary Deployments访问临时部署功能(PS:即灰度发布) Feature Flags之后部署功能 用GitLab Releases将发布说明添加到任意Git

    9.6K43

    码农,你真的了解TDD和BDD吗?

    Kent Beck JUnit 和 TDD 两件事都有着重大贡献,也就不难理解为什么 TDD 节奏叫“红-绿-重构”了。... BDD 的话语体系中,“测试”概念就由“行为”所代替,所以,这种做法称之为行为驱动开发。...Dan North 不仅仅提出了概念,而且为了践行他想法,他还创造了第一个 BDD 框架:JBehave。后来又改写出基于 Ruby 版本 RBehave,这个项目后来被并到 RSpec 中。...从最开始基于 Ruby BDD 框架发展成今天,Cucumber 已经变成了支持很多不同程序设计语言 BDD 测试框架,比如常见 Java、JavaScript、PHP 等等。...,所以,理解步骤定义关键就是知道它是如何将二者关联起来

    88110

    logstash input插件开发

    本文以开发logstashcos input插件为例,介绍如何开发logstashinput插件。.../ 环境准备 logstash使用jruby开发,首先要配置jruby环境: 1 安装rvm rvm是一个ruby管理器,可以安装并管理ruby环境,也可以通过命令行切换到不同ruby版本。...,jar-dependencies用于ruby环境中管理jar包,并且可以跟踪jar包加载状态。...方法,获取到指定bucket里数据,并在每次定时任务执行结束后设置marker保存在本地,再次执行时从marker位置获取数据,以实现数据增量同步。...是一个ruby测试库,通过bundle命令执行rspec: bundle exec rspec 如果cos.rb中代码没有语法或运行时错误,则会出现如果信息表明测试成功: Finished in 0.8022

    4.1K61

    开发人员看测试之TDD和BDD

    通过下面一幅图就可以发现对于测试也有不同层次和流程: ?   从图中可以发现,最下面的是单元测试(白盒测试),主要用于测试开发人员编写代码是否正确,这部分工作都是开发人员自己来做。...而BDD更加侧重设计,其要求设计测试用例时候对系统进行定义,倡导使用通用语言将系统行为描述出来,将系统设计和测试用例结合起来,从而以此为驱动进行开发工作。   ...I want和so that则指明了该角色想做事, 以及想达到目的。   这三个断句定义了这个系统行为参与者、范围。   同样一个Story,可能会有不同场景。...Cuke4Duke PHP – PHPSpec Python – Specipy RubyRSpec, Shoulda, Cucumber 与Java相关BDD测试工具: JBehave –...Inspired by Rspec BDoc - Extracts behaviour from unit tests

    2K60

    函数式编程优与劣

    越来越多编程语言支持函数式编程风格,人们学习如何使用它们。函数式编程已不像以前那么小众——现在Ruby,Java和JavaScript都使用了函数式编程思想。 ?...如果你Ruby或JavaScript中使用它,你必须确保使用函数循环列表前尾递归优化是可用。如果没有,你将在递归中遇到性能问题。...所以你如何应对这种情况?你作用域很小,只函数调用时绑定必须变量。你不能编写修改状态代码,比如在一系列循环中。你只能在函数调用时绑定状态,然后递归。...通过这种方式,你可以维护状态改变,绑定状态变量值时很难出现错误。 不要使用全局变量。它会跑到作用域外。 相比那些所谓拥有函数式编程语言,这就是你将在真正函数式语言中看到两点关键不同点。...函数式程序设计重用能力更上一层楼,使代码更清晰,不过没有优化运行环境中会有潜在性能代价。

    67220

    函数式编程优与劣

    越来越多编程语言支持函数式编程风格,人们学习如何使用它们。函数式编程已不像以前那么小众——现在Ruby,Java和JavaScript都使用了函数式编程思想。 ?...如果你Ruby或JavaScript中使用它,你必须确保使用函数循环列表前尾递归优化是可用。如果没有,你将在递归中遇到性能问题。...所以你如何应对这种情况?你作用域很小,只函数调用时绑定必须变量。你不能编写修改状态代码,比如在一系列循环中。你只能在函数调用时绑定状态,然后递归。...通过这种方式,你可以维护状态改变,绑定状态变量值时很难出现错误。 不要使用全局变量。它会跑到作用域外。 相比那些所谓拥有函数式编程语言,这就是你将在真正函数式语言中看到两点关键不同点。...函数式程序设计重用能力更上一层楼,使代码更清晰,不过没有优化运行环境中会有潜在性能代价。

    77410

    微软发布IronRuby

    其中,IronRuby与Java VM上JRuby类似,但与Ruby/.NET Bridge之类工具不同,这类工具只是将Ruby解释器于.NET VM相连接。...Ruby社区观望者对微软官方Ruby实现期待已经有些时日了,迹象之一就是John Lam,Ruby.CLR作者,目前是微软员工,他常常到如ruby-core论坛上询问和Ruby及其部分标准库行为相关详细问题...另一项努力就是两个Google SoC资助项目,用来使用RSpec(一个针对“可执行规范”Ruby框架)来定义可规范Ruby行为测试套件。...很显然,这对于JRuby、Rubinius或者IronRuby这所有的Ruby实现来说,这是非常重要,因为要了解那些行为和功能应当实现是至关紧要。...这也证明了我们JRuby上所花时间和精力没有白费,而且也强调了JVM上Ruby和其它动态语言重要性。 查看原文:Microsoft announces IronRuby

    899100

    谷歌阵地失守!ChatGPT又准又快,改bug完全不需要搜

    大部分人都不会关注每次版本更新到底都有哪些内容变动,但ChatGPT把它们都记下来了。...ChatGPT回答: PHP8中,extract()函数行为变得更加严格。...事实证明,根据ChatGPT答案几分钟内就可以修完bug,其中很大一部分原因是知道去哪里找到答案,并且ChatGPT也说明了不同版本 PHP 中函数行为如何变化。...ChatGPT回答:当从 PHP 7.4迁移到 PHP 8时,有一些函数和特性可能会无法运行或具有不同行为。...(); PHP 8.0中删除了 create_function() 函数,建议使用匿名函数; list()构造,与 foreach 一起使用时,现在会将键和值作为单独变量返回,而非单个数组; PHP

    54120

    技术执念

    ,有的留下来了,不过也都在不断演化,改变(不兼容API,不同版本等等随处可见)。...仅仅从学习速度上来讲,我们已经远远无法跟上科技演化节奏了,这是人类自身一种限制。 知识陷阱 假设你一个Ruby项目上,学习了Rails/ActiveRecord/RSpec/MySQL。...图中灰色方框中内容是项目要求知识,另外则是我根据自己兴趣学习(两者基本上各占一半)。事实上有很多内容(尤其是根据自己兴趣学习真正要使用时,可能还需要学一遍。...碎片话阅读方式易于消费,只需要很少思考就可以读懂,但是危害严重,它们并不会帮助你提升理解力。...毕竟,有意思东西是太多了,各种范式编程语言,编译器技术,人工智能,数据可视化,地理信息系统,嵌入式设备,软硬件结合,大数据,自动化测试等等,每一个方向都有无穷无尽有意思东西。

    71540
    领券