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

Minitest Mock无法处理命名参数问题求助

解决Minitest Mock匹配命名参数时的参数错误问题

问题原因

你遇到的错误源于Minitest Mock对位置参数和关键字参数的匹配逻辑分离:

  • 你在expect中将哈希放在位置参数数组里([{ original_id: :id, ... }]),表示期望where方法接收一个包含哈希的位置参数。
  • 但实际调用where(original_id: coverage.id, waiting_for_doc_requests: false)时,Ruby将这些命名参数解析为关键字参数,而非位置参数的哈希,导致Minitest检测到位置参数为空数组,与预期不匹配。

解决方案

根据你的where方法定义类型,选择对应的预期设置方式:

1. 方法接收关键字参数(如def where(original_id:, waiting_for_doc_requests: false))

将关键字参数直接放在expect的关键字参数部分,位置参数数组留空:

mock = Minitest::Mock.new
mock.expect(:where, :results, [], original_id: :id, waiting_for_doc_requests: false)

2. 方法接收哈希作为位置参数(如Rails ActiveRecord的where)

如果where方法实际接收哈希作为位置参数(Ruby会自动将命名参数写法转为哈希),可使用参数匹配器做模糊匹配,避免因具体值不匹配导致的问题:

mock = Minitest::Mock.new
mock.expect(:where, :results, [hash_including(original_id: :id, waiting_for_doc_requests: false)])

hash_including会匹配包含指定键值对的任意哈希,无需完全一致。

3. 通用模糊匹配(适用于不确定参数类型的场景)

如果不需要严格匹配参数值,可使用anything匹配器:

mock = Minitest::Mock.new
mock.expect(:where, :results, [], original_id: anything, waiting_for_doc_requests: false)

内容的提问来源于stack exchange,提问作者Mark Kadlec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:43:15