我有兩個哈希包含數組。在我的情況下,數組元素的順序並不重要。有沒有一種簡單的方法來匹配RSpec2中的哈希?如何匹配包含數組忽略數組元素的順序的哈希?
{ a: [1, 2] }.should == { a: [2, 1] } # how to make it pass?
P.S.
有一個數組匹配器,它忽略了順序。
[1, 2].should =~ [2, 1] # Is there a similar matcher for hashes?
SOLUTION
該解決方案爲我工作。最初由托克蘭建議,修復。
RSpec::Matchers.define :match_hash do |expected|
match do |actual|
matches_hash?(expected, actual)
end
end
def matches_hash?(expected, actual)
matches_array?(expected.keys, actual.keys) &&
actual.all? { |k, xs| matches_array?(expected[k], xs) }
end
def matches_array?(expected, actual)
return expected == actual unless expected.is_a?(Array) && actual.is_a?(Array)
RSpec::Matchers::BuiltIn::MatchArray.new(expected).matches? actual
end
要使用匹配:
{a: [1, 2]}.should match_hash({a: [2, 1]})
感謝您的想法。 '=〜'在這裏不起作用,需要調用'RSpec :: Matchers :: BuiltIn :: MatchArray.new(expected).matches? actual'。我在上面的問題中添加了修復程序。 – Evgenii 2012-07-07 06:18:02
@Evgeny:更新你的(好)建議。 – tokland 2012-07-07 14:56:13
得到錯誤'未初始化的常量RSpec :: Matchers :: BuiltIn :: MatchArray'。看起來這個匹配器在最近的版本中已經被棄用了?我在Rails 5中使用了'rspec-core' 3.6.0。爲了解決這個問題,我只是將'same_elements?'方法簡化爲'xs.sort == xy.sort' – user2490003 2017-09-22 13:01:40