универсальная функция для проверки, если объекты в перечислении содержат свойство, и если оно равно 10 - PullRequest
1 голос
/ 19 января 2011

В моих тестовых примерах я хочу пройтись по коллекции объектов (разные объекты, в зависимости от scenerio), и если объекты в коллекции содержат свойство location_id Я хочу убедиться, что идентификатор имеет значениенапример, 10

Все объекты в коллекции будут одного типа, но не все коллекции будут иметь одинаковый тип, т. е. некоторые могут быть коллекцией пользователей, коллекцией или статьями и т. д.*

Мне нужно это для моих тестов rspec.

1 Ответ

1 голос
/ 19 января 2011

Предполагая, что «содержать свойство» означает «отвечает на метод получения»:

def test_for_value( collection, getter_method, value )
  # Only look deeper if the collection isn't empty
  # and the first element has the method
  if (o=collection.first) && o.respond_to?( getter_method )
    collection.find{ |o| o.send(getter_method)==value }
  end
end

Person = Struct.new( :name, :age )

people = []
p test_for_value( people, :age, 38 )
#=> nil

people << Person.new( "Gavin", 38 )
people << Person.new( "Imogen", 5 )

p test_for_value( people, :age, 38 )
#=> #<struct Person name="Gavin", age=38>

p test_for_value( people, :age, 5 )
#=> #<struct Person name="Imogen", age=5>

p test_for_value( people, :horns, true )
#=> nil

Если вместо этого вы говорите о коллекциях хэшей и хотите найти ключ хеша:

def test_for_value( collection, key, value )
  if (o=collection.first) && o.key?( key )
    collection.find{ |o| o[key]==value }
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...