Size: a a a

Saint P Ruby Community

2021 March 03

NB

Nikita Bulai in Saint P Ruby Community
Aleksandr Pilishenko
Часто портируешь? Кавычки заменить надо будет, или используешь непереностмые киллер фичи своей базы?)
Я так за любой подход почти могу сказать. Мол не юзаю и норм, живу себе
источник

AP

Aleksandr Pilishenko in Saint P Ruby Community
Anton Davydov
Скорее я о каноничном рейлс вее говорю
Это только говорит об ущербности (с т.з. srp) каноничного рейлс-вея)
источник

v

vveare138 in Saint P Ruby Community
max
а что ты там тестировать собрался?
я уверен Arel и AR протестированы хорошо
иначе это получаются фиктивые тесты проверяющие что код 2+2 действительно возвращает 4 и вызывает операцию + - конфигурацию тестируешь
вот такие портянки User.active.allowed_to_sign.page(5).per_page(10).all
источник

m

max in Saint P Ruby Community
Anton Davydov
Чейн вызовов. Его почти не реально юнит тестом покрыть
это тавтология
есть тесты в AR/Arel которые проверяют что методы чейнятся, это работает и работает правильно
а если ты хочешь тестировать что `User.active.allowed_to_sign.page(5).per_page(10).all` возвращает 5 активных пользователей, которым можно залогиниться, в 5 страниц по 10 на страницу - то ты конфигурацию тестируешь, что программист нигде не опечатался. по сути пишешь 2 раза одно и тоже: в реализации и в тестах
источник

AD

Anton Davydov in Saint P Ruby Community
Aleksandr Pilishenko
Это только говорит об ущербности (с т.з. srp) каноничного рейлс-вея)
Скорее ущербности мвс как паттерны для чего-то сложнее чем куда для базы
источник

AS

Alexander Susikov in Saint P Ruby Community
Anton Davydov
2. Можешь, а можешь прямо класс методы писать. Будет похоже на ту идею, которую репозиторий продвигает
Ну так я и пытаюсь объяснить, что можно ar рельсовый использовать как репозиторий 🙂 надо выполнить только 2 пункта
1. Работаем только через скоупы - никаких where
2. Прокидываем модель как зависимость-репозиторий
источник

AD

Anton Davydov in Saint P Ruby Community
Alexander Susikov
Ну так я и пытаюсь объяснить, что можно ar рельсовый использовать как репозиторий 🙂 надо выполнить только 2 пункта
1. Работаем только через скоупы - никаких where
2. Прокидываем модель как зависимость-репозиторий
Все так
источник

AP

Aleksandr Pilishenko in Saint P Ruby Community
Anton Davydov
Скорее ущербности мвс как паттерны для чего-то сложнее чем куда для базы
Мвц это lite-версия приложения, а дальше накручиваешь dlc, всё в порядке))
источник

AS

Alexander Susikov in Saint P Ruby Community
Просто изначально понял что претензия именно именно к чейну скоупов - в этом ничего плохого я не вижу. Если я не правильно понял претензию то сорян за кипишь😀
источник

AD

Anton Davydov in Saint P Ruby Community
max
это тавтология
есть тесты в AR/Arel которые проверяют что методы чейнятся, это работает и работает правильно
а если ты хочешь тестировать что `User.active.allowed_to_sign.page(5).per_page(10).all` возвращает 5 активных пользователей, которым можно залогиниться, в 5 страниц по 10 на страницу - то ты конфигурацию тестируешь, что программист нигде не опечатался. по сути пишешь 2 раза одно и тоже: в реализации и в тестах
Не, тут смотри идея какая: у тебя сервис есть в котором вызывается чейн модели + обрабатывается результат. В случае юнит теста, тебе важно проверить логику обработки запроса в зависимости от пары случаев модели. А юнит тест покрывает контракты между сервисом и моделью
источник

AD

Anton Davydov in Saint P Ruby Community
Вот в чисто рельсовом подходе, ты пишешь в интеграционных тестах то, что можно проверить юнит тестом
источник

AD

Anton Davydov in Saint P Ruby Community
Aleksandr Pilishenko
Мвц это lite-версия приложения, а дальше накручиваешь dlc, всё в порядке))
Не совсем, у мвс есть пара проблем, например: где валидации разные держать и бизнес логику
источник

AD

Anton Davydov in Saint P Ruby Community
Никакие длс тебе тут не помогут
источник

AD

Anton Davydov in Saint P Ruby Community
Alexander Susikov
Просто изначально понял что претензия именно именно к чейну скоупов - в этом ничего плохого я не вижу. Если я не правильно понял претензию то сорян за кипишь😀
Хм, вроде нет, об этом не говорилось прямо явно
источник

AP

Aleksandr Pilishenko in Saint P Ruby Community
Anton Davydov
Никакие длс тебе тут не помогут
Длц - это все прочие слои приложения, что угодно, так что помогут) Хреново конечно, что dhh не дал нам универсальный космолёт и чтобы всё по solid, что поделать
источник

m

max in Saint P Ruby Community
Anton Davydov
Не, тут смотри идея какая: у тебя сервис есть в котором вызывается чейн модели + обрабатывается результат. В случае юнит теста, тебе важно проверить логику обработки запроса в зависимости от пары случаев модели. А юнит тест покрывает контракты между сервисом и моделью
в такой ситуации лучше тогда этот вызов чейн модели выносить как DI
тогда тестируешь только как обрабатывается результат он входных данных
сам чейн уже тестировать не надо

вот пример
module ActivityMonitoring
 module Notifiers
   class UserEmail
     def self.call(...)
       new(...).call(...)
     end

     def self.users
       ::User.monitoring_activity.index_by(&:id)
     end

     def initialize(users: self.class.users, **)
       @users = users

       super()
     end

     def call
       @users.reject(...).map(...).whatever(...)
     end
  end
end

# ----------
describe ActivityMonitoring::Notifiers::UserEmail do
 let(:users) do
   {
     2 => :user2,
     3 => :user3,
     4 => :user4
   }
 end

   describe '#call' do
   context 'with data' do
     it 'return correct result' do
       expect(described_class.new(users: users).call).to eq(....)
     end
end
(я это выдернул из кода, мог не всё почистить, так что не факт что рабочий)
источник

m

max in Saint P Ruby Community
всё. тестируешь своё кастомное поведение. рельсу тестировать не надо
если надо потом обратно в базу сохранять делаешь еще одно DI - user_saver
class UserSaver
 def call(users)
   users.each(&:save!)
 end
end

еще и в базу лазить не придется что бы результат проверить
источник

m

max in Saint P Ruby Community
с каким-нибудь AutoInject и контенерами половина бойлерплейта уйдет
источник

AP

Aleksandr Pilishenko in Saint P Ruby Community
max
с каким-нибудь AutoInject и контенерами половина бойлерплейта уйдет
И так неплохо выглядит, не надо менять бойлерплейт на мета-магию в которую не умеет ide, пожалуйста
источник

m

max in Saint P Ruby Community
а то получается что это не юнит-тесты бизнес логики
а интеграционные e2e тесты AR/Arel и бизнес логики
источник