有效地检查JSON响应是否包含数组中的特定元素

时间:2011-01-30 23:53:36

标签: ruby json rspec rspec2

鉴于JSON响应:

{
  "tags": [
    {
      "id": 81499,
      "name": "sign-in"
    },
    {
      "id": 81500,
      "name": "user"
    },
    {
      "id": 81501,
      "name": "authentication"
    }
  ]
}

使用RSpec 2,我想验证此响应是否包含名称为authentication的标记。作为一个相当新的Ruby,我认为有一种比迭代数组和使用include检查名称的每个值更有效的方法?或地图/收集。我可以简单地使用正则表达式来检查/ authentication / i,但这似乎也不是最好的方法。

到目前为止,这是我的规范:

it "allows filtering" do
  response = @client.story(15404)

  #response.tags.
end

1 个答案:

答案 0 :(得分:4)

所以,如果

t = JSON.parse '{ ... }'

然后这个表达式将返回nil,这是假的,或者它将返回它检测到的东西,其布尔值为true。

t['tags'].detect { |e| e['name'] == 'authentication' }

如果没有NoMethodError密钥,则会引发tags。我认为在测试中处理得很好,但您可以安排该案例也显示为false(即nil):

t['tags'].to_a.detect { |e| e['name'] == 'authentication' }