我希望我的哈希看起来像这两个中的一个:
{metadata: {SOME_UNKNOWN_KEY: {transaction_id: 123456}}}
{metadata: {transaction_id: 123456}}
如果我正在寻找密钥:transaction_id
,我了解我可以使用hash_including
来预期应该位于特定位置的嵌套密钥,但我还是喜欢能够做这样的事情来涵盖两个选项:
expect(something).
to receive(some_method).
with(hash_including(metadata: hash_including_anywhere(:transaction_id)))
这可能吗?
答案 0 :(得分:0)
当然可以!
看看如何实现hash_including
,可以看到它是一个简单的匹配器类:
https://github.com/rspec/rspec-mocks/blob/master/lib/rspec/mocks/argument_matchers.rb#L70
HashIncluding
matcher基于BaseHashMatcher
,看起来如果你用一些递归的方法来检查是否有关键隐藏在更深的地方你应该好好去:
https://github.com/rspec/rspec-mocks/blob/master/lib/rspec/mocks/argument_matchers.rb#L183
您可以从阅读hash_including
的规范开始:https://github.com/rspec/rspec-mocks/blob/master/spec/rspec/mocks/hash_including_matcher_spec.rb
定义你自己的匹配器听起来很可怕,因为它们在我们的测试中像魔术一样工作,但实际上写起来并不复杂。