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
相关产品推荐
相关产品推荐

