将activerecord结果与排序结果进行比较

时间:2016-07-29 20:59:06

标签: ruby-on-rails ruby activerecord rspec rails-activerecord

我在rspec中编写一个测试,以确保函数返回正确排序的结果集。测试看起来像这样:

it 'returns matching accounts' do
  results = Account.search(<search conditions>)
  expect(results).to eq results.order(<order clause>)
end

结果集看起来是等效的,但测试仍然失败。以下测试确实通过了:

it 'returns matching accounts' do
  results = Account.search(<search conditions>)
  expect(results.map &:id).to eq results.order(<order clause>).map &:id
end

我很满意这个测试做了我需要的,但有没有更好的方法来比较两个ActiveRecord关系?

1 个答案:

答案 0 :(得分:2)

Account.search可能不会返回一个帐户数组,而是ActiveRecord::Relation。当你在关系上调用order时,它将返回一个不同的关系对象,因此不匹配。

另一方面,如果在该关系上调用一个强制关系实际对数据库运行查询的方法,则返回一个数组。 map是一种方法,其他可能是eachfirstany?load等。

load似乎是一个很好的选择,强制实际从数据库加载记录:

it 'returns matching accounts' do
  results = Account.search(<search conditions>)
  expect(results.load).to eq results.order(<order clause>).load
end

另一种选择可能是将结果与数组进行比较,该数组是在Ruby中而不是在数据库中进行排序的。这取决于你真正想要测试的内容,如果这是一个更好的选择:

it 'returns matching accounts' do
  results = Account.search(<search conditions>).load
  expect(results).to eq results.sort_by(&:attribute_to_sort_on)
end