【问题标题】:Compare activerecord results with sorted results将 activerecord 结果与排序结果进行比较
【发布时间】:2016-07-29 20:59:06
【问题描述】:

我正在 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 关系?

【问题讨论】:

  • 第一次失败的错误信息是什么?

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


【解决方案1】:

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

【讨论】:

  • load 神秘地与一​​个测试一起工作,但不是另一个。我最终在 ActiveRecord 关系上使用to_a 来比较它们。我也尝试过在 Ruby 中排序的数组,但这给了我一个不同的“等效”行顺序 - 没有错,但对于与数据库结果进行比较没有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 2012-05-10
相关资源
最近更新 更多