2016-07-29 2 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 по отношению, он возвращает другой объект отношения и, следовательно, не соответствует.

С другой стороны, если вы вызываете метод по этому отношению, который заставляет отношение фактически запускать запрос к базе данных, возвращается массив. 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 
+0

'load' таинственно работал с одним тестом, но не с другим. Я закончил использование 'to_a' в отношениях ActiveRecord, чтобы сравнить их. Я также попробовал массив, отсортированный в Ruby, но это дало мне другой порядок с «эквивалентными» строками - не так, но не полезно для сравнения с результатом из базы данных. –

Смежные вопросы