
Alex
26.06.2017
12:01:08
и в конце даже примерычи на скале есть

Grigory
26.06.2017
12:02:27
ничоси
но я так понимаю что не особо что поменялось с выхода паперов по оптике обощающих и бидайрект преобразований различных

Alex
26.06.2017
12:03:23
ну grate еще придумали

Google

Alex
26.06.2017
12:03:49
http://r6research.livejournal.com/28050.html
это всё в общем то из серии datatype-generic, где мультиплейты и шейплессы
только в качестве базы берется не функтор а профунктор
чтобы можно было туда и сюда

Vadim
26.06.2017
12:17:58
Вопрос по тестированию. Кто как тестирует бизнес-логику, которая взаимодействует с внешними сервисами, например делает запросы к REST-API или к БД? Кто чем мокает (mock) такие сервисы? ScalaMock ?

Alexandr
26.06.2017
12:18:57
Mockito

Vadim
26.06.2017
12:20:14
Mockito
Он же джавайский? Или есть scala обертка?

Alexandr
26.06.2017
12:21:00
А в чем проблема то?
Он прекрасно мокает трейты

Diemust
26.06.2017
12:21:57
ServiceT, ServiceImpl, ServiceMock + DI, если втупую

Vadim
26.06.2017
12:22:15
А метод внутри scala object может?

Alexandr
26.06.2017
12:22:52
По-моему, лучше просто не нужно так писать, чтобы потом нужно было object'ы мокать :)

Vadim
26.06.2017
12:23:39
Ну, object HttpWeb {def getUriAsString(uri): Future[String]).

Google

Vadim
26.06.2017
12:23:48
Как замокать?

Vladimir
26.06.2017
12:24:05
а надо ли?)

Alexey
26.06.2017
12:24:10
Товарищи подскажите такую штуку, могу ли я использовать аковские стримы вместо Rx, типо у меня Subject, в котором переодически меняется значение и это рассасывается?
Я чо то не смог найти ничего подобного

Vadim
26.06.2017
12:25:34
а надо ли?)
Дык, я хочу тестировать бизнес-логику,которая делает запросы, используя этот метод объявленный в HttpWeb. Зачем мне делать *реальные* запросы к сервису?

Diemust
26.06.2017
12:25:58
мокай сервис тогда

Alexandr
26.06.2017
12:26:18
Почему HttpWeb - это объект, а не класс?
Вот основной вопрос

Roman
26.06.2017
12:27:02
Мне как-то надо было замокать апи amazon s3. Я что-то выпил, потом как в тумане все. Очнулся - а там уже 50 звёзд на гитхабе: https://github.com/findify/s3mock

Vadim
26.06.2017
12:27:23

Alexandr
26.06.2017
12:27:54
Не надо его инстанциировать каждый раз. Достаточно 1 раз как синглтон
По-моему, много статей было же, почему плохо писать логику в статических методах

Grigory
26.06.2017
12:29:41
@clayrat спасибо!

A
26.06.2017
12:31:09
Vadim кажется ты тестируешь то, что я планирую тестировать чуть попозже
я хотел делать фековый сервис, который поднимается до тестов, а внутри тестов в свою обёртку пробрасывать кастомный конфиг
и так тестировать весь проект, который похож на трубу, у которого начало и конец один

Vadim
26.06.2017
12:33:01

A
26.06.2017
12:33:04
клиент использует эту штуку http://kazuhiro.github.io/scala/akka/akka-http/akka-streams/2016/01/31/connection-pooling-with-akka-http-and-source-queue.html
то есть нужно только хост прописать

Vadim
26.06.2017
12:34:54
Допусти, так
object HttpWeb {
private val STRICT_ENTITY_TIMEOUT = 999.days
def getUriAsString(uri: Uri)
(implicit system: ActorSystem, materializer: ActorMaterializer
): Future[String] = {
val resp = Http().singleRequest(HttpRequest(uri = uri))
resp flatMap { r =>
if (r.status == StatusCodes.OK) {
r.entity.toStrict(STRICT_ENTITY_TIMEOUT).map(_.data.utf8String)
} else {
r.entity.discardBytes()
Future.failed(
new Exception(s"Remote server at $uri has returned status code: ${r.status.value}"))
}
}
}
}

Aleksei
26.06.2017
12:35:25
гисты и прочие сервисы делают код намного читаемее

Alexandr
26.06.2017
12:35:26
Нет, ну мое дело посоветовать :)

Diemust
26.06.2017
12:36:57
дао тоже через обджект пишешь? бизнес-логика там не пишется, возвращается фьюча, туда-сюда

Google

A
26.06.2017
12:37:08
https://stackoverflow.com/questions/26811401/scala-override-a-class-method-in-a-trait
вот так не лету в тесте переопределить обьект клиента, на фековый клиент
но это опять какое-то кунг-фу
наверно правильней инжектить это всё через конструкторы и тд и тп

Vadim
26.06.2017
12:39:28

Alexandr
26.06.2017
12:41:22
У меня плохие новости. Если пишутся юнит-тесты, то почти для всех "кусков кода" есть как минимум две реализации - реальная и тестовая

Vadim
26.06.2017
12:41:53
Изначальный вопрос был не в том, как проектировать архитектуру программы. А в том, какую либу кто использует для мокания внешних сервисов.
Может быть имеется стандарт де-факто в Scala мире. Например, в Java - это Mockito

Aleksei
26.06.2017
12:43:07
мокито вполне годно юзается и в скале

Kirill
26.06.2017
12:44:33
Ситуация: доступ в инет через прокси, поднят нексус, который проксирует некоторый набор реп, сбт глобально добавлен резолвер на нексусовые прокси-репы. Беда: зависимости для сбт плагина выкачиваются вечность, так как сначала они ищутся по внешним репам (которые недоступны), а затем лишь резолвятся в нексусе.
Вопрос: как сбт отрезать все тентакли, которые лезут куда-либо, кроме нексуса?

Alexandr
26.06.2017
12:45:34
Вписать nexus в ~/.sbt/repositories

Kirill
26.06.2017
12:45:37
А то на каждой "сокет нот коннектед" уходит по 10 секунд ожидания. Наверно уже минут 20 резолвит все для sbt-assembly

Vadim
26.06.2017
12:45:40

Aleksei
26.06.2017
12:45:50

Kirill
26.06.2017
12:46:51

Alexandr
26.06.2017
12:47:18
Если это было бы сделано, то сборка в первую очередь смотрела бы именно вписанные туда репозитории
Это даже в доках говорится
This repositories file is all that’s required to use a proxy repository. These repositories will get included first in any sbt build

Kirill
26.06.2017
12:50:56
Реальность иная
Стандартные репозитории это не исключило

Alexandr
26.06.2017
12:51:16
У меня тоже nexus и зависимости качаются именно оттуда :)

Kirill
26.06.2017
12:54:31
Хм. Может я еще какой-то репозиторий недоуказал.
Как же больно за проксей :(

Google

Bulat
26.06.2017
12:58:01
В сбт можно переопределить порядок резолверов

Andry
26.06.2017
13:01:55

Kirill
26.06.2017
13:02:36
Как я понял, можно сделать какой-нибудь global.sbt и там все вырезать
У меня сейчас артефакты для sbt-assembly резолвились полчаса, каждый выдавал по 2 ошибки Socket is not connected по внешнему адресу. А в конце все радостно скачалось с нексуса)

Bulat
26.06.2017
13:04:07
я делал таким костылем:
appResolvers := appResolvers.value.map(_.filter {
case _: FileRepository => true
case _ => false
}),
resolvers ++= Seq(
"my proxy repo" at "http://proxy.nexus.mycompany.com/public/",
DefaultMavenRepository,
"Maven Central Server" at "http://central.maven.org/maven2",
...
)

Kirill
26.06.2017
13:04:56
Во, как-то так и я сейчас попробую, спасибо)

Bulat
26.06.2017
13:05:18
после первого резолвинга и кэширования локально и/или на прокси ничего потом нигде снаружи не ищется

Vadim
26.06.2017
13:06:33
Делаем заглушки как отдельный сервис...
Ок. Я в принципе пришел к следующему решению.
trait HttpWebSpec { def someMethod }
object HttpWeb extends HttpWebSpec { .... implementation of the trait above.. }
А уже в unit-test'ах мокаю HttpWebSpec - mock[HttpWebSpec], через when(..).return(...) описываю желаемое поведение.
Использую ScalaMock.

Admin
ERROR: S client not available

Alexandr
26.06.2017
13:09:06
Ну, вот. Это уже гораздо лучше, чем пытаться мокать объект

Vadim
26.06.2017
13:10:43
?

Andry
26.06.2017
13:12:21
Я в unit-тестах тестирую только простые функции, без обращения к сервисам... Сервисы и собственно говоря бизнес логика потом тестируются отдельно на заглушках ...

Vadim
26.06.2017
13:14:58

Nikolay
26.06.2017
13:21:19

Mikhail
26.06.2017
13:24:44
кто тестирует, тот не пьет шампанского)

Oleg
26.06.2017
13:36:54

Vadim
26.06.2017
13:43:36
фриманатки
Можешь привести пример. Очень интересно. Не слишком ли это overkill для тестов?

A
26.06.2017
13:44:09
а какой CI в скале модно использовать?

Nikolay
26.06.2017
13:44:33

A
26.06.2017
13:44:41
модно

Google

D
26.06.2017
13:44:43
Да.

Nikolay
26.06.2017
13:44:55
hudson?

A
26.06.2017
13:44:58
на можно / не можно мне пофиг )
@rockjam мне сервис

Nikolay
26.06.2017
13:45:45
опенсорсные проекты на гитхабе собираются тревисом и circle, еще дрон

A
26.06.2017
13:45:46
как и везде travic ?

Nikolay
26.06.2017
13:45:53
circle
кажется он моднее

A
26.06.2017
13:46:06
ок, то чего-то "своего" нет

Nikolay
26.06.2017
13:46:19
akka-CI

A
26.06.2017
13:46:29
которое с sbt / ide / чем-то там ещё дружит

Oleg
26.06.2017
13:46:40

Nikolay
26.06.2017
13:46:51
shapeless-CI - опиши конфигурации HList-ами и Record-ами
с IDE дружит teamcity

Alex
26.06.2017
13:47:22
teamcity дружит c sbt из коробки

Nikolay
26.06.2017
13:47:42
из коробки и circle и travis дружат вроде

A
26.06.2017
13:47:56
teamcity так и не превратили в сервис

Nikolay
26.06.2017
13:48:08
ну слушай, если тебе тревис привычен - бери его. если хочешь что-то новое изучить, то не знаю, circle

Oleg
26.06.2017
13:49:06

Alex
26.06.2017
13:53:39
Travis CI currently does not support git repositories hosted on Bitbucket or GitLab, or other version control systems such as Mercurial.