rspec - проверяет, содержит ли массив элемент с указанным идентификатором - PullRequest
0 голосов
/ 24 августа 2018

Мой метод контроллера возвращает массив, и я намерен проверить, включен ли элемент с определенным идентификатором, что-то вроде:

expect(json_resp["animals"]).to contain_element_with_attribute(:id => 4)

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Поскольку имя вашей переменной упоминает JSON, я предполагаю, что у вас есть массив хэшей.В этом случае вы можете использовать double include:

expect(json_resp["animals"]).to include(include("id" => 4))

Внешний вызов говорит, что массив должен содержать элемент, соответствующий его параметру;затем внутренний описывает, как сопоставить этот элемент: здесь, выполнив еще одно совпадение include для хэша.

(Обратите внимание, я предположил, что у вашего хэша есть строковые ключи, опять же, потому что JSON; вам понадобитсяиспользовать то, что подходит для ваших данных.)


Если вместо этого ваш массив содержит обычные классы, вы все равно можете использовать include для массива, но затем have_attributes для объекта внутри:

expect(json_resp["animals"]).to include(have_attributes(id: 4))
0 голосов
/ 24 августа 2018

Немного сложно понять, о чем вы спрашиваете.

Возвращает массив чего?Хэш?Объекты?

Я предполагаю, что вы хотите утверждать, что один из хэшей или объекты должны иметь значение четыре в ключе идентификатора.

Вы можете использовать совпадение членства в коллекции RSpec:

expect(actual).to include(expected)

В сочетании с командой pluck или map (в зависимости от того, что возвращается, я на самом деле не знаю, какова ваша ситуация).

let(:result) { json_resp['animals'].pluck(:id) }
# OR
let(:result) { json_resp['animals'].map { |element| element.fetch(:id) }


it 'returns an object with an id value of 4' do
  expect(result).to include(4)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...