Как следует проверять области видимости 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
Тестирование прямых внутренних запросов такого типа на самом деле не имело места для меня раньше, и по номиналу это привлекательно для меня, так как оно не касается базы данных, поэтому никакая скорость не понесла.
Однако это меня беспокоит, потому что:
- он делает тест черного ящика серым (er)
- Я должен сделать предположение, что, поскольку что-то настроено определенным образом, я получу результаты, которые требует моя бизнес-логика.
Пример, который я использовал, настолько тривиальен, что, возможно, мне будет хорошо проверять конфигурацию, но:
- где вы рисуете строку и говорите, что содержимое этой именованной области слишком сложное и требует тестирования на подтверждение результата сверх и только для тестирования конфигурации области? Эта линия существует или должна ли она?
- Существует ли законная/хорошо принятая/ "лучшая практика" (извините) способ тестирования названных областей, не касаясь базы данных или, по крайней мере, касаясь ее минимально или это просто неизбежно?
- Используете ли вы один из указанных способов для проверки своих областей или какого-либо другого метода?
Этот вопрос (-ы) немного похож на Тестирование названных областей с помощью RSpec, но я не мог найти ответы/мнения о результатах тестирования области видимости или области видимости конфигурации.