2017-08-28 78 views
0

我希望我的哈希看起來像這兩個中的一個:RSpec:有沒有辦法在任何級別檢查嵌套的散列鍵?

{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

肯定有可能!

尋找如何hash_including實施可以看出,這是一個簡單的匹配器類有:

https://github.com/rspec/rspec-mocks/blob/master/lib/rspec/mocks/argument_matchers.rb#L70

HashIncluding匹配是基於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

定義自己的匹配聽起來很嚇人,因爲他們喜歡在我們的測試中魔術工作,但他們實際上沒有那麼複雜寫。

+0

還沒有機會將其付諸實踐,但這絕對看起來是正確的方向。謝謝! – tjukes

相關問題