我在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关系?
答案 0 :(得分:2)
Account.search
可能不会返回一个帐户数组,而是ActiveRecord::Relation
。当你在关系上调用order
时,它将返回一个不同的关系对象,因此不匹配。
另一方面,如果在该关系上调用一个强制关系实际对数据库运行查询的方法,则返回一个数组。 map
是一种方法,其他可能是each
,first
,any?
,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