2016-07-29 109 views
0

我在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是这样的方法,其他的可能是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 
+0

'负载'神秘地与一​​个测试但不是另一个测试一起工作。我最终使用ActiveRecord关系上的'to_a'来比较它们。我也尝试了一个用Ruby排序的数组,但是这给了我一个与“等价”行不同的顺序 - 没有错,但与数据库的结果比较没有用。 –