首页
学习
活动
专区
工具
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 (第一部分:入门)

RSpec的API就是决定你希望代码如何表现并在你的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文件的配置

    GitLab的CI/CD 完全是由.gitlab-ci.yml 文件内容决定的 GitLab的CI/CD的具体内容是由.gitlab-ci.yml文件定义的, 一个在GitLab的项目,项目根目录只有有....gitlab-ci.yml文件,并且配置了Runner,那么每次提交代码 都会触发CI的pipline .gitlab-ci.yml文件是告诉GitLab的runner去做什么在每次触发后,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.4K30

    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.3K20

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

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

    17710

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

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

    1.3K100

    用 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

    10K43

    开发人员看测试之TDD和BDD

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

    2.1K60

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

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

    98510

    “小众”之美——Ruby在QA自动化中的应用

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

    1.9K30

    logstash input插件开发

    本文以开发logstash的cos input插件为例,介绍如何开发logstash的input插件。.../ 环境准备 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

    函数式编程的优与劣

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

    67520

    函数式编程的优与劣

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

    77710

    微软发布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

    901100

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

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

    55220

    技术的执念

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

    71540
    领券