如何在RSpec中测试哈希内无序数组的元素完整性?
在RSpec中忽略数组顺序验证含data的哈希的解决方案
直接用RSpec内置的match_array匹配器结合哈希断言就能解决,不用逐个检查元素,下面是两种常用写法:
方法一:精准匹配哈希结构+忽略data数组顺序
如果需要严格验证哈希的其他字段,仅忽略data数组的顺序,可以用以下两种写法:
expected = { code: 200, data: [{id: 1, name: "foo"}, {id: 2, name: "bar"}] } actual = { code: 200, data: [{id: 2, name: "bar"}, {id: 1, name: "foo"}] } # 写法1:直接用match指定字段规则 expect(actual).to match( code: 200, data: match_array(expected[:data]) ) # 写法2:用hash_including(适合只验证部分键的场景) expect(actual).to match(hash_including( data: match_array(expected[:data]) ))
关键说明
match_array会验证数组元素的存在性和完整性,完全不关心顺序- 数组元素如果是哈希,
match_array会递归检查每个哈希的键值对是否完全一致,无需额外处理
内容的提问来源于stack exchange,提问作者BluePrint
相关产品推荐
相关产品推荐

