2011-01-21 50 views
18

ActiveRecord对象是否有Rspec的一个很好的方法来比较两个ActiveRecord对象而忽略ID,& C吗?例如,假设我从XML中解析出一个对象,并从夹具中加载另一个对象,而我测试的是我的XML解析器正常工作。我目前有一个自定义匹配器比较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,&Ç相同的,我不知道是否有来测试不仅仅是通过骑自行车的好办法,清理掉这些变量和检查。

回答

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 2012-09-26 13:19:34