Как следует тестировать именованные области Rails? Проверяете ли вы результаты, возвращаемые из области действия, или правильность настройки вашего запроса?
Если у меня есть класс User
с методом .admins
, например:
class User < ActiveRecord::Base
def self.admins
where(admin: true)
end
end
Я бы, вероятно, указал, чтобы убедиться, что я получаю результаты, которые я ожидаю:
describe '.admins' do
let(:admin) { create(:user, admin: true) }
let(:non_admin) { create(:user, admin: false) }
let(:admins) { User.admins }
it 'returns admin users' do
expect(admins).to include(admin)
expect(admins).to_not include(non_admin)
end
end
Я знаю, что это влечет за собой попадание в базу данных, но я действительно не видел другого выбора, если хотел проверить поведение прицела.
Однако в последнее время я видел, что области определяются путем подтверждения их правильной настройки, а не возвращаемого набора результатов. Для этого примера что-то вроде:
describe '.admins' do
let(:query) { User.admins }
let(:filter) { query.where_values_hash.symbolize_keys }
let(:admin_filter) { { admin: true } }
it 'filters for admin users' do
expect(filter).to eq(admin_filter) # or some other similar assertion
end
end
Раньше мне никогда не приходило в голову тестирование внутренней части такого запроса, и по номинальной стоимости он мне нравится, поскольку он не касается базы данных, поэтому не происходит никакого снижения скорости.
Однако меня это беспокоит, потому что:
- это делает тест черного ящика серым (э-э)
- Я должен сделать предположение, что, поскольку что-то настроено определенным образом, я получу результаты, которые требует моя бизнес-логика.
Пример, который я использовал, настолько тривиален, что, возможно, я был бы в порядке, просто протестировав конфигурацию, но:
- где вы проводите черту и говорите, что «содержание этой именованной области слишком сложно и требует тестов для подтверждения результатов, помимо простого тестирования конфигурации области»? Эта линия вообще существует или должна быть?
- Существует ли законный/хорошо принятый/"лучшая практика" (извините) способ протестировать именованные области, не касаясь базы данных или, по крайней мере, минимально касаясь ее, или это просто неизбежно?
- Используете ли вы какой-либо из вышеперечисленных способов проверки своих областей видимости или какой-либо другой метод?
Этот вопрос (вопросы) немного похож на Тестирование именованных областей с помощью RSpec, но мне не удалось найти ответы/ мнения о результатах тестирования по сравнению с конфигурацией области.