如何在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'
相关产品推荐
相关产品推荐

