Alexander
а то конечно, все считают что они нужны. Я тоже. Но чтобы понтоваться тестами, они должны быть и функциональными, и и нтерграционными. А столько тестов я писать не собираюсь )
Мерль
не пишут тесты @ тратят недели на отладку принтами @ после каждого изменения повторять заново
Мерль
такое
⏺ Vаdim
😂😂😂
Alexander
Скиньте кто нибудь mysql.cnf с какого нибудь боевого сервера, plz
Alexander
о да, а кто пишет тесты, не дебажат, вахахахах )
⏺ Vаdim
зачем дебажить, когда есть fmt.Println))))
Dmitry
Дали приложение, исправить багу. Нужно было в нескольких местах исправлять и добавить 1 канал. Тестов не было, исправлять отказался, поставил костыль, рядом комментарий.
Мерль
о да, а кто пишет тесты, не дебажат, вахахахах )
но меньше надо просто понимать, что юнит тесты — это та же отладка принтами, только автоматизированная
Pawel
а то конечно, все считают что они нужны. Я тоже. Но чтобы понтоваться тестами, они должны быть и функциональными, и и нтерграционными. А столько тестов я писать не собираюсь )
функциональные, и интерграционные тесты в 99% случаев не нужны, ибо они неоправданно сложные и дорогие. Достаточно -юнит - дёшево и сердито
Pawel
зачем дебажить, когда есть fmt.Println))))
иногда delve спасает от 100 кратного перезапуска и переписывания print
⏺ Vаdim
не в обиду если че)
⏺ Vаdim
пятницо
⏺ Vаdim
все мои подколы без злого умысла
Andrey
был проект, небыло тестов, все хорошо работало и все были довольны, проект рос, и в какой-то момент начал ломатся, разработчики вместо внедрения фич чинили баги, когда баги починили решили не внедрять новых фич, а покрыть хоть как-то проект тестами, первые тесты которые были, это просто функции которые запускали другие функции, не ожидая какого-то ответа (просто проверяли не вылетело ли все в панику) и даже такие тесты нашли кучу багов в проекте, хз зачем я это пишу :)
Andrey
ну в общем какой-то мало-мальски большой проект написать без тестов просто не реально (возможно я и все мои коллеги просто туповаты, такой вариант тоже не стоит исключать)
Dmitry
Есть другая сторона медали. Мой коллега, каждой структуре пишет интерфейс. Каждое поле структуры приватное, и для неё написан геттер. И для каждого геттера написан юнит-тест. Хотя в большинстве они просто возвращают значение поля.
ceiling cat
Это странные тесты, на мой взгляд
Anatoly
get/set отличный способ отлова несанкционированного изменения значения поля структуры.
Anatoly
при командной разработке иногда сокращает в разы время поиска проблемы, для одиночек неактуально
Anatoly
не знаю
Andrey
в других языках гетеры и сетеры часто используются, и в той-же идеи генерируются автоматически
Andrey
странно что для го такого нету
Michael
протестил кнопку нет - работает
⏺ Vаdim
функциональные, и интерграционные тесты в 99% случаев не нужны, ибо они неоправданно сложные и дорогие. Достаточно -юнит - дёшево и сердито
я пока имел в опыте больше фунциональных, дабы гарантировать работу живущего проекта при запиле новых фич. Вот хотелось бы побольше опыта в юнит тестах, есть к чему стремиться
Pawel
я пока имел в опыте больше фунциональных, дабы гарантировать работу живущего проекта при запиле новых фич. Вот хотелось бы побольше опыта в юнит тестах, есть к чему стремиться
попробуй по книжке роя ошерова втянуться, она не плохой считается. жаль нет аналогичной для гошечки - в дотнэте ужасные фреймворки для тн=естирования, в Го всё с этим хорошо
⏺ Vаdim
Помню на таком проекте запилил фичу, запустил тесты, 2 теста не прошли Смотрю, блин да они вообще не связанны с моей фичией, ну никак, почему ломаются. Начал смотреть в код, бац очень очень косвенно зависиость была таки. Без тестов я бы думал что все ок, и только на бою когда бы стали отваливаться клиенты, только тогда бы узнал что-то то не так, по логам, звонкам в тех поддержку, это же ппц
Pawel
я - крайне редко. у меня ни когда не было 100% покрытия и я к этому не стремился.
Niko
Не понимаю пока с интерфейсами Могу ли я не вывести, а получить отсюда Id??? Как это сделать? func(c *routing.Context) error { fmt.Printf("%+v\n", c.Get(apis.User).Id) c.Write(c.Get(apis.User)) return nil } //&{Id:1}
Niko
В контекст записал, вывести могу, значит доступ к свойствам для дальнейшей работы с ними тоже должен иметь. Верно ведь?
Niko
@ruzzke_mir Я имею структуру type User struct { Id int `json:"id" db:"id"` } func (u *User) GetId() int { return u.Id } Как передать сюда мой параметр Id из контекста, что выше?
Mike
Привет! Никто не юзает эту либу для тестов веб- и неочень- сервисов? https://github.com/stretchr/testify Нравится как выглядит, читаемо, кмк.
Niko
@ruzzke_mir что-нибудь вроде user := new models.User{"Id": c.Get(apis.User).Id} Но это не работает
Pawel
@ruzzke_mir что-нибудь вроде user := new models.User{"Id": c.Get(apis.User).Id} Но это не работает
то есть ты спрашиваешь - как получить юзера по его ID? в таком случае при чём здесь контекст?
Michael
вместо new может амперсанд &
Niko
Я извиняюсь за свои вопросы, но прошу помочь решить этот вопрос
Niko
@ruzzke_mir В контексте у меня находится данные пользователя, которого я получил по токену из db "Аутентифицировал" так сказать. Однако чтоб дальше получить какие-то объекты этого пользователя мне нужен хотя бы его id. А это уже находится в контексте, потоу что в процессе аутентификации я поместил пользователя в пустой интерфейс Identify token := parseBearerAuth(c.Request.Header.Get("Authorization")) identity, e := fn(c, token) if e == nil { c.Set(User, identity) return nil }
Niko
здесь в identify я передаю models.User, который получил по токену из бд. Как мне теперь получить его из контекста?
Pawel
естественно это очень схематичный ответ
Niko
вот кстати мой routing.Contect func (c *Context) Get(name string) interface{} { return c.data[name] } // Set stores the named data item in the context so that it can be retrieved later. func (c *Context) Set(name string, value interface{}) { if c.data == nil { c.data = make(map[string]interface{}) } c.data[name] = value }
Anonymous
Что-то как-то сложно
Anonymous
лучше: user := c.Get(apis.User).(models.User)
Niko
Niko
@nuqzz не катит
Anonymous
@nuqzz не катит
ну еще бы new без скобок
Anonymous
и вообще злобный микс из литерала и new
Niko
@nuqzz level=error msg="interface conversion: interface {} is *models.User, not models.User"
Anonymous
@nuqzz level=error msg="interface conversion: interface {} is *models.User, not models.User"
это значит там указатель на структуру лежит, надо приводить к указателю: user := c.Get(apis.User).(*models.User)
Anonymous
очевидно, что даже gotour не был пройден на эту тему)
Niko
@nuqzz дружище, спасибо большое!!! наконец-то получил данные из контекста. Пошел дальше изучать go на примере создания микросервиса
jajaeee
Michael
го тур не читай - микро сервисы клепай)
Niko
😂😂😂
Niko
тогда все будет точно по феншую)))
Pawel
господа, кто нибудь gopherjs использует? я уже тут как-то спрашивал. не ужели по нулям?
Valentin
вчера на митапе про него вещали
Anatoly
господа, кто нибудь gopherjs использует? я уже тут как-то спрашивал. не ужели по нулям?
на митапе • Алексей Акулович "Golang по обе стороны баррикад"
Valentin
Общий вывод- все работает, но писать фронт на нем это изврат
Anatoly
презентовал игрушку на Go на базе GotherJs
Anatoly
попробуй связаться
Valentin
Илья
откуда инфа? сам придумал?
ты в issues репы часто заглядываешь? там болячек много разных
Valentin
Да просто смысла нету даже
Valentin
Лучше уж TypeScript