Подтвердить что ты не робот

Rails -Testing named scopes: результаты проверки области или конфигурации области?

Как следует проверять области видимости 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, но я не мог найти ответы/мнения о результатах тестирования области видимости или области видимости конфигурации.

4b9b3361

Ответ 1

Я думаю, что вы очень хорошо описали проблему, и что лучший ответ, на мой взгляд, - это зависит.

Если ваша область действия тривиальна, запустите where, с некоторыми order и т.д. нет реальной необходимости протестировать ActiveRecord или базу данных, чтобы убедиться, что они работают правильно - вы можете что они были правильно реализованы и просто проверяют структуру, которую вы ожидаете.

Если, с другой стороны, ваша область (или любой запрос) сложна или использует расширенные функции в сложной конфигурации, я считаю, что настройка тестов, которые утверждают ее поведение, с использованием реальной живой базы данных (которая установлена локально, с небольшим настраиваемым набором данных) может значительно помочь вам убедиться, что ваш код работает.

Это также поможет вам, если и когда вы решите изменить стратегии (используйте эту классную новую функцию mysql или портируйте на postgresql), чтобы безопасно реорганизовать, проверив, что функциональность надежна.

Это намного лучший способ, чем просто проверить, что строка SQL - это то, что вы там набрали...