Подтвердить что ты не робот

Сравнение объектов ActiveRecord с Rspec

Есть ли хороший способ в Rspec сравнить два объекта ActiveRecord, игнорируя id, & c? Например, скажем, что я разбираю один объект из XML и загружаю другой из прибора, и то, что я тестирую, заключается в том, что мой XML-парсер работает правильно. В настоящее время у меня есть пользовательский сокет с

actual.attributes.reject{|key,v| %w"id updated_at created_at".include? key } == expected.attributes.reject{|key,v| %w"id updated_at created_at".include? key }

Но мне интересно, есть ли лучший способ.

А потом немного сложнее, но есть ли способ сделать подобную вещь на множестве? Скажем, что парсер XML также создает несколько объектов, принадлежащих оригинальному объекту. Поэтому набор, который я заканчиваю, должен быть идентичным, кроме id, created_at, и c, и мне интересно, есть ли хороший способ проверить, что помимо простого перехода на велосипед, очистка этих переменных и проверка.

4b9b3361

Ответ 1

Более короткий способ написать выше будет actual.attributes.except(:id, :updated_at, :created_at).

Если вы используете это много, вы всегда можете определить свой собственный матчи следующим образом:

RSpec::Matchers.define :have_same_attributes_as do |expected|
  match do |actual|
    ignored = [:id, :updated_at, :created_at]
    actual.attributes.except(*ignored) == expected.attributes.except(*ignored)
  end
end

Поместите это в свой spec_helper.rb, который вы можете теперь сказать в любом примере:

User.first.should have_same_attributes_as(User.last)

Удачи.