Сравнение объектов ActiveRecord с Rspec - PullRequest
18 голосов
/ 22 января 2011

Есть ли хороший способ в 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, create_at и & c, и мне интересно, есть ли хороший способ проверить это, кроме циклического прохождения, очистки этих переменных и проверки.

1 Ответ

25 голосов
/ 27 января 2011

Короче говоря, можно написать 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)

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...