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

rai*_*ive 5 ruby json rspec rspec2

鉴于 JSON 响应:

{
  "tags": [
    {
      "id": 81499,
      "name": "sign-in"
    },
    {
      "id": 81500,
      "name": "user"
    },
    {
      "id": 81501,
      "name": "authentication"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  #response.tags.
end
Run Code Online (Sandbox Code Playgroud)

Dig*_*oss 6

因此,如果

t = JSON.parse '{ ... }'
Run Code Online (Sandbox Code Playgroud)

然后这个表达式要么返回nil,它是假的,要么返回它检测到的东西,它的布尔值为真。

t['tags'].detect { |e| e['name'] == 'authentication' }
Run Code Online (Sandbox Code Playgroud)

NoMethodError如果没有tags密钥,这将引发。我认为这在测试中处理得很好,但是您可以安排这种情况也显示为 false(即 nil):

t['tags'].to_a.detect { |e| e['name'] == 'authentication' }
Run Code Online (Sandbox Code Playgroud)