Ruby on rails 将json响应与哈希数组进行比较
当我在JSON响应中得到一个对象数组时,它们可能以不同的顺序表示 有时候我会这样Ruby on rails 将json响应与哈希数组进行比较,ruby-on-rails,ruby,json,hash,rspec,Ruby On Rails,Ruby,Json,Hash,Rspec,当我在JSON响应中得到一个对象数组时,它们可能以不同的顺序表示 有时候我会这样 JSON.parse(response.body) # => [{"a" => "b"}, {"c" => "d"}] 还是这个 JSON.parse(response.body) # => [{"c" => "d"}, {"a" => "b"}] 但对我来说,这两个结果都是正确的。测试响应中的哪些对象(无论其顺序如何)的最简单方法是什么?您可以使用散列将其转换为类似集合的结
JSON.parse(response.body) # => [{"a" => "b"}, {"c" => "d"}]
还是这个
JSON.parse(response.body) # => [{"c" => "d"}, {"a" => "b"}]
但对我来说,这两个结果都是正确的。测试响应中的哪些对象(无论其顺序如何)的最简单方法是什么?您可以使用散列将其转换为类似集合的结构
first_response.inject({}){|s, h| s[h] = true; s}
将与
second_response.inject({}){|s, h| s[h] = true; s}
除了其他有用的功能外,gem还有一个
be\u json\u eql
匹配器,它的工作方式与顺序无关。可能重复的是,您想比较这两个键还是只想检查是否存在某些键?@padde,我想比较数组中的两个或更多哈希。但我不想比较它们在数组中的顺序。我不确定be\u json\u eql
的可能重复项是否与顺序无关。代码看起来像@actual,@expected=scrub(actual\u json,@path),scrub(@expected\u json)
,然后直接执行@actual==@expected
。scrub
方法负责排除您不想成为比较的一部分的键(例如,updated\u at
),并“规范化”JSON,它只调用JSON.pretty\u generate
或来生成JSON
。