Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!08.03.2023
Відтворення стану бази для тестів з FactoryBot.
Найцікавіше, що я робив за останні дні — то розбудував цілу систему для відтворення стану бази для тестів. Трохи вже писав про це в грудні. Але то був прототип. Покористувавшись ним, побачив, що можна було зробити краще. Оскільки кодом проєкту поділитись не можу, розкажу загальні ідеї.
По-перше, у FactoryBot багато нетривіальних функцій, знаючи які, можна переносити більше логіки створення записів у фабрики. В ідеалі, всі неважливі для тесту атрибути мають бути приховані в фабриці. В цьому допомагають, наприклад, тимчасові атрибути, створення декількох обʼєктів з блоком налаштувань, та, звісно, риси. На кожний семантичний різновид запису для тестів краще робити рису, саме так й будуть приховані неважливі атрибути.
По-друге, можна не зупинятись на фабриках, а загортати їх в більш доцільний DSL. Якщо ваша бізнес-логіка потребує особливого стану бази, то можна сховати подробиці за DSL. Це може бути як власний модуль, так і складна фабрика, що створює не просто запис, а цілий контекст. Завдяки колбекам фабрики можуть робити буквально будь-що.
Головна мета — тест має бути написаний мовою бізнесу. Бо найгірше для тестів — це коли треба підготувати багато контексту, але зміст цього контексту втрачається за сервісним кодом, таким як виклик фабрик та оголошення параметрів.
Як приклад: якщо в моделі інтернет-крамниці є користувач, а в нього є крамниця, а в ній є товари, та ми пишемо тест для модуля, що обробляє товари, то він не має явно описувати користувача та крамницю. Краще мати фабрику, яка разом з товаром створює його необхідні асоціації. Або якщо зайти з іншого боку, фабрика може створювати крамницю з наповненням товарами. Але головне, що неважливі, хоч і потрібні для тесту записи мають бути прихованими з коду самого тесту.