Ruby on rails 将activerecord结果与排序结果进行比较

Ruby on rails 将activerecord结果与排序结果进行比较,ruby-on-rails,ruby,activerecord,rspec,rails-activerecord,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 它“返回匹配的帐户”吗 结果=Account.search() expect(results).to eq res

我正在rspec中编写一个测试,以确保函数返回正确排序的结果集。测试如下所示:

it 'returns matching accounts' do
  results = Account.search(<search conditions>)
  expect(results).to eq results.order(<order clause>)
end
它“返回匹配的帐户”吗
结果=Account.search()
expect(results).to eq results.order()
结束
结果集似乎是等效的,但测试仍然失败。以下测试确实通过:

it 'returns matching accounts' do
  results = Account.search(<search conditions>)
  expect(results.map &:id).to eq results.order(<order clause>).map &:id
end
它“返回匹配的帐户”吗
结果=Account.search()
expect(results.map&:id).to eq results.order().map&:id
结束

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

帐户。搜索可能不会返回帐户数组,而是返回一个。对关系调用
order
时,它将返回不同的关系对象,因此不匹配

另一方面,如果对该关系调用一个方法,强制该关系对数据库实际运行查询,则返回一个数组
map
就是这样一种方法,其他方法可能是
每个
第一个
任何?
加载
,等等

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

it 'returns matching accounts' do
  results = Account.search(<search conditions>)
  expect(results.load).to eq results.order(<order clause>).load
end
它“返回匹配的帐户”吗
结果=Account.search()
expect(results.load).to eq results.order().load
结束
另一个选项可能是将结果与数组进行比较,该数组在Ruby中排序,而不是在数据库中排序。这取决于您真正想要测试的内容,如果这是一个更好的选项:

it 'returns matching accounts' do
  results = Account.search(<search conditions>).load
  expect(results).to eq results.sort_by(&:attribute_to_sort_on)
end
它“返回匹配的帐户”吗
结果=Account.search().load
expect(results).to eq results.sort_by(&:attribute_to_sort_on)
结束

帐户。搜索可能不会返回帐户数组,而是返回一个。对关系调用
order
时,它将返回不同的关系对象,因此不匹配

另一方面,如果对该关系调用一个方法,强制该关系对数据库实际运行查询,则返回一个数组
map
就是这样一种方法,其他方法可能是
每个
第一个
任何?
加载
,等等

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

it 'returns matching accounts' do
  results = Account.search(<search conditions>)
  expect(results.load).to eq results.order(<order clause>).load
end
它“返回匹配的帐户”吗
结果=Account.search()
expect(results.load).to eq results.order().load
结束
另一个选项可能是将结果与数组进行比较,该数组在Ruby中排序,而不是在数据库中排序。这取决于您真正想要测试的内容,如果这是一个更好的选项:

it 'returns matching accounts' do
  results = Account.search(<search conditions>).load
  expect(results).to eq results.sort_by(&:attribute_to_sort_on)
end
它“返回匹配的帐户”吗
结果=Account.search().load
expect(results).to eq results.sort_by(&:attribute_to_sort_on)
结束

第一次失败的错误消息是什么?第一次失败的错误消息是什么?
load
神秘地在一个测试中工作,而不是在另一个测试中。最后,我在ActiveRecord关系上使用了
来比较它们。我还尝试了一个用Ruby排序的数组,但这给了我一个不同的“等价”行顺序——没有错,但与数据库的结果进行比较时没有用。
load
神秘地处理了一个测试,而不是另一个测试。最后,我在ActiveRecord关系上使用了
来比较它们。我还尝试了用Ruby排序的数组,但这给了我一个不同的顺序,即“等效”行-没有错,但对于与数据库的结果进行比较没有用处。