Эффективная проверка того, что ответ JSON содержит определенный элемент в массиве

Учитывая ответ JSON:

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

Используя RSpec 2, я хочу убедиться, что этот ответ содержит тег с аутентификацией имени. Будучи новичком в Ruby, я решил, что есть более эффективный способ, чем повторение массива и проверка каждого значения имени с помощью include? или карту/собрать. Я мог бы просто использовать регулярное выражение для проверки /authentication/i, но это тоже не лучший подход.

Это моя спецификация на данный момент:

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

  #response.tags.
end

person raidfive    schedule 30.01.2011    source источник


Ответы (1)


So, if

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

Затем это выражение либо вернет nil, что является ложным, либо вернет то, что оно обнаружило, что имеет логическое значение истинности.

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

Это поднимет NoMethodError, если нет ключа tags. Я думаю, что это прекрасно обрабатывается в тесте, но вы можете организовать, чтобы этот случай также отображался как ложный (т. Е. Ноль) с помощью:

t['tags'].to_a.detect { |e| e['name'] == 'authentication' }
person DigitalRoss    schedule 31.01.2011
comment
Превосходно! Именно тот метод, который я искал :) Забыл посмотреть на класс Enumerable. - person raidfive; 31.01.2011