Илья
hamper 𓅝
И правда, так работает.
🏁Александр
что-то попробывал с DI
🏁Александр
ну "такое"
🏁Александр
как мокать такие хедлеры не понятно
🏁Александр
придется мокать весь "супер обьект"
Aleksandr
Aleksandr
покажи свой хэндлер
🏁Александр
type UsersHandler struct {
app *application.MyApplication
}
func (h * UsersHandler) Index(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
...
h.app.GetResponce().EmptySuccess(w)
}
🏁Александр
ну что-то в этом стиле
🏁Александр
самый минимальный показал
🏁Александр
ну и конструктор конечно:
func NewClinicHandler(app *application.MyApplication) *UsersHandler {
return &UsersHandler{
app: app,
}
}
Aleksandr
хэндлер у тебя зависит от приложения? странно
Aleksandr
обычно он зависит например от db-слоя, сервисов
🏁Александр
у меня есть пакет application
🏁Александр
в нем в фабрике - NewApplication стартуют все подключения, все что при инициализации делается
Aleksandr
так является ли application зависимостью для хэндлера?
🏁Александр
они свои "коннекты" кидают в стуктуру и эта структура уже начинает везде фигурировать
🏁Александр
🏁Александр
на самом деле там есть абстракция webserver, потом уже от нее идет прокидывания в хедлер того же самого
🏁Александр
я пытался избавиться от нудной правки зависимостей каждый раз
🏁Александр
это такое аналог DI
Aleksandr
ок. я отвечу за тебя. не является. прокидывать dic - это известный антипаттерн. если ты прокидываешь dic, то у тебя не di, а его имитация. Потому и протестить не сможешь нормально
🏁Александр
а что есть dic?
Aleksandr
di container
Aleksandr
контейнер твоих зависимостей
🏁Александр
так
🏁Александр
а как тогда правильно? если мы хотим таки DI
Aleksandr
прокидывать не dic, а конкретные зависимости
🏁Александр
а зачем нам тогда DI?
Aleksandr
🏁Александр
да читал
🏁Александр
я думал что в этом и заключается
🏁Александр
что мы контейнер лихо пихаем везде и забывает про зависимости
Je
Aleksandr
🏁Александр
а хедлеры в тестах значит работают без DI и кормяться вручную
Aleksandr
Roman
уже есть какие-нибудь фреймворки кодогенераторы декларативных API тестов?
🏁Александр
ну я просто знаю как в PHP сделан DI, все классы которым требуются зависимости дергаются через оберточку аля DI("/namespace/className") дальше уже движок разбирает что там в конструкторе за зависимости и пытается их накормить (если есть)
Roman
есть идея как реализовать декларативные тесты GraphQL апишек, определяешь:
1. query
2. ожидаемый JSON
3. conditions (макро-функции, реализуются в Go коде)
Dmitry
Коллеги, панику из горутины никак не отловить?
🏁Александр
Dmitry
https://play.golang.org/p/N6NGMFH86g2
🏁Александр
🏁Александр
в нем и отлавливайте
Dmitry
Т е автоматически никак.
🏁Александр
ну окей
🏁Александр
в гоу то как принято с DI?
Aleksandr
в го не принято di, сам знаешь
🏁Александр
Dmitry
Ок, спасибо
🏁Александр
наоборот все говорили "ну зависимости надо статически отдавать и ок"
🏁Александр
в смысле методов наделать аля GetDB()
Aleksandr
Aleksandr
🏁Александр
и где его простите применять?
🏁Александр
если я не могу контейнер с ним скоримть в хедлер
Aleksandr
🏁Александр
в данном случаи этот контейнер в структуре MyApplication
Aleksandr
postStore := NewPostStore(container.GetDb())
userStore := NewUserStore(container.GetDb())
🏁Александр
и зачем это?
🏁Александр
я с такми же успехом могу написать
Aleksandr
а не
postStore := NewPostStore(container)
userStore := NewUserStore(container)
🏁Александр
db := db.NewConnect()
ostStore := NewPostStore(db)
userStore := NewUserStore(db)
🏁Александр
почему тогда сразу не так?
🏁Александр
только сущность наплодили "лишную"
Aleksandr
и зачем это?
чтобы тестировать зависимости, а не зависимости зависимостей.
Зачем твой компонент будет зависеть от чужих зависимостей, если должен зависеть от своих?
Aleksandr
🏁Александр
нихрена
Aleksandr
если он не создает новый коннект кажддый раз, то это норм
🏁Александр
создает
Aleksandr
ну а зачем?
🏁Александр
мы же в main и это уже вызов идет бд непосрдественно
Aleksandr
так что сказать то хочешь?