2016-07-29 18 views
0

rspecで関数が正しくソートされた結果セットを返すようにテストを書いています。テストは次のようになります。activerecordの結果とソート結果の比較

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を呼び出すと、別のリレーションオブジェクトが返されるため、一致しません。

一方、リレーション上で実際にデータベースに対してクエリを実行する関係を強制するメソッドを呼び出すと、配列が返されます。

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

mapは、他のeachfirstany?loadなど

load実際にデータベースからレコードをロードする強制的に、使用するために良い選択であると思われるかもしれないような方法であり、もう1つの選択肢は、結果をデータベースではなく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

'load'は1つのテストで不思議に動作しましたが、別のテストでは不思議でした。 ActiveRecord関係で 'to_a'を使って比較しました。私もRubyでソートされた配列を試してみましたが、それは私に「等価な」行で異なる順序を与えました。間違いではありませんが、データベースの結果との比較には役に立たない。 –

関連する問題