You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在RSpec中Mock方法使其返回自身入参?

如何在RSpec中Mock方法使其返回自身入参?

当然可以做到!你想要的效果是让被Mock的方法不管传入什么哈希参数,都原封不动返回那个参数本身,完全跳过原方法里的修改逻辑对吧?这在RSpec里实现起来很简单,核心思路是利用Mock的块语法捕获传入的参数,然后直接返回它。

给你两种常用的实现方式:

方式一:无参数类型限制(适配任意入参)

这种写法会让my_method对任何传入的参数都直接返回自身,不需要提前指定具体的哈希内容:

allow(instance_of_my_class).to receive(:my_method) do |arg|
  arg
end

或者更简洁的单行写法:

allow(instance_of_my_class).to receive(:my_method) { |arg| arg }

方式二:限定参数为哈希(更严谨)

如果只想针对哈希类型的参数生效,其他类型参数仍然走原方法逻辑,可以加上类型匹配器:

allow(instance_of_my_class).to receive(:my_method).with(kind_of(Hash)) do |arg|
  arg
end

完整测试示例

为了让你更清楚怎么用,这里给一个完整的测试用例:

class MyClass 
  def my_method(h)
    h.merge!(some_new_key: "some new value")
  end
end

RSpec.describe MyClass do
  it "returns the original hash without modifying it" do
    test_hash = { original_key: "original value" }
    instance = MyClass.new

    # 配置Mock,让my_method返回传入的参数本身
    allow(instance).to receive(:my_method) { |h| h }

    result = instance.my_method(test_hash)
    
    # 验证返回的是同一个对象
    expect(result).to be(test_hash)
    # 验证原方法的修改逻辑没有执行(没有新增的key)
    expect(result).not_to have_key(:some_new_key)
  end
end

这个写法的优势就在于不需要提前指定具体的哈希内容,不管你传入什么任意哈希,都会原封不动返回它,完美匹配你的需求~

备注:内容来源于stack exchange,提问作者dB'

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:12:59