将ActiveRecord对象与Rspec进行比较

时间:2011-01-21 21:30:35

标签: ruby-on-rails 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,我想知道是否有一种很好的方法来测试它,除了循环,清除这些变量和检查。

1 个答案:

答案 0 :(得分: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)
祝你好运。