RSpec:有没有办法在任何级别检查嵌套的哈希键?

RSpec:有没有办法在任何级别检查嵌套的哈希键?,rspec,Rspec,我希望我的散列看起来像以下两种: {metadata: {SOME_UNKNOWN_KEY: {transaction_id: 123456}}} {metadata: {transaction_id: 123456}} 如果我正在寻找键:transaction\u id,我知道我可以使用hash\u include来期望嵌套键应该位于特定位置,但我希望能够这样做以涵盖这两个选项: expect(something). to receive(some_method). with(has

我希望我的散列看起来像以下两种:

{metadata: {SOME_UNKNOWN_KEY: {transaction_id: 123456}}}
{metadata: {transaction_id: 123456}}
如果我正在寻找键
:transaction\u id
,我知道我可以使用
hash\u include
来期望嵌套键应该位于特定位置,但我希望能够这样做以涵盖这两个选项:

expect(something).
  to receive(some_method).
  with(hash_including(metadata: hash_including_anywhere(:transaction_id)))
这可能吗?

当然可能

查看
hash\u包括
是如何实现的,可以看出它是一个简单的matcher类:

hashinclude
matcher是基于
BaseHashMatcher
的,如果您使用某种递归方法来检查密钥是否隐藏在更深的地方,您应该可以:

您可以从阅读
hash\u的规范开始,包括
开始:


定义自己的matcher听起来很可怕,因为它们在我们的测试中就像魔术一样工作,但实际上编写起来并没有那么复杂

目前还没有机会将其付诸实践,但这看起来确实是正确的方向。谢谢