配列を含む2つのハッシュがあります。私の場合、配列要素の順序は重要ではありません。RSpec2でそのようなハッシュを一致させる簡単な方法はありますか?
{ a: [1, 2] }.should == { a: [2, 1] } # how to make it pass?
PS
順序を無視する配列のマッチャーがあります。
[1, 2].should =~ [2, 1] # Is there a similar matcher for hashes?
解決
解決策は私のために働きます。もともとはトークランドによって提案されましたが、修正が加えられています。
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]})