Эффективно проверьте, что ответ JSON содержит определенный элемент в массиве - PullRequest
4 голосов
/ 31 января 2011

Учитывая ответ 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

1 Ответ

4 голосов
/ 31 января 2011

Итак, если

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

Тогда это выражение либо вернет nil, что является ложным, либо вернет обнаруженную вещь, которая имеет логическое значение true.

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

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

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