2011-01-21 4 views
18

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

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, и мне интересно, есть ли хороший способ проверить, что помимо просто езды на велосипеде, очистка этих переменных и проверка.

ответ

25

Более короткий способ написать выше будет 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) 

Хороший удачи.

+4

для меня это работает только с кавычками '[" id "," updated_at "," created_at "]' – zishe

+1

Чтобы заставить его работать как со строками, так и с символами, вы можете использовать HashWithIndifferentAccess: 'actual.attributes.with_indifferent_access.except. ..'. – mrzasa

+1

Я получаю 'undefined method' attributes'', когда я пытаюсь это сделать. Что может быть неправильным? –

Смежные вопросы