169 похожих чатов

Привет, вопрос по Rx. Есть функция, в которой создаётся completable

и происходит подписка на него. Как её можно протестить? Наружу ничего не торчит, и, например использовать blockingSubscribe я не могу.

23 ответов

16 просмотров

https://stackoverflow.com/questions/41699020/how-to-assert-if-a-completable-has-been-subscribed-completed-rxjava2

Dzmitry- Автор вопроса

Функция ничего не возвращает, вся реактивщина в ней, ни test ни runblocking я не могу использовать. По ссылка у задающего вопрос возвращается Completable.

Ну комплитабле в принципе ни чего не возвращает

Dzmitry- Автор вопроса

Ну можно сам completable вернуть и подписаться с помощью blockingSubscribe()/

Я просто не понимаю зачем с комплитаблом чтот изобретать. Он как тип добавили в базу? Да, нет.

Dzmitry- Автор вопроса

Ничего не изобретается. Внутри комплитабла выполняется асинхронная операция, которую не должен ждать тот кто её запускает. Но для того чтобы покрыть тестами этот код, мне нужно дождаться когда весь асинхронный код выполнится.

Из определения это процессор. (не должен ждать кто её запускает)

Один из принципов создания тестируемого асинхронного кода - это абстракция планировщика/диспатчера и подстановка его специальной синхронной версии для тестов. Лучше всего через конструктор тестируемого класса. Например из этой статьи можно использовать некоторые паттерны.

Dzmitry- Автор вопроса

Проблема в том, что класс не могу менять чтобы подставить шедулер. Есть вот эта функция, и нужно после ее вызова каким то образом дождаться завершения цепочки.

Так а блокингСабскрайб чем не подошел?

Dzmitry- Автор вопроса

Тем что в бизнес логике сабскрайб должен быть не блокинг, а в тесте его не на чем вызывать

Почему не можете менять класс то?) Тогда нужна конкретика, что за функция там есть у вас, смотря какой completable создаёт и как выглядит вся цепочка (судя по всему она целиком в методе).

Dzmitry- Автор вопроса

Там все сложно на самом деле. Комплитабл запускает саспенд функцию которая выполняет основную работу, т.к. Легаси на rx, но постепенно добавляют корутины.

Вам не кажется, что это то ещё тестить обертку в виде комплитабле над суспенд функциями. Ну в целом это звучит уже как-то...

Dzmitry- Автор вопроса

Безусловно это не лучшее решение, но оно не моё и что-то с этим сделать я не могу) кроме как протестить и сдать таску

Либо обособленнон добавление. Именно обособленно, а не попытки все это смешать в винигрет

То есть вы только пишите тесты к имеющемуся коду, а сам его трогать не можете?) К сожалению, чтобы написать тесты код должен быть написан тестируемым.

А так если по сикрету всему свту это чьё решение? Ну я понимаю ещё миграцию частичную когда новые сервисы суспенд, старые ещё на рхе. И они как бе независимы и ждут своего часа (когда нить)))

Dzmitry- Автор вопроса

Нет, конкретно эту функцию написал я, но она использует другую, которая позволяет запускать саспенды в сервисе, в котором нет корутин контекста.

Dzmitry- Автор вопроса

Ну примерно так и есть, запросы к БД - саспенд, а код который их использует не имеет корутин контекста, и с помощью вот такого костыля все работает.

Честно вот прям хз как это все тестить. Не сталкивался с такими оборотами. Всегда старались отделить подобное, а ещё и тестить блин хз

Звучит, что там в нескольких местах нужен рефакторинг, чтобы улучшить тестируемость. Вы сами видите, что это костыль. Подозреваю что там completable вызывает корутину через runblocking. Есть ещё вариант подменять в тестах планировщик без модификации класса, а извне, через точки расширения rxjava, например в RxJavaPlugins.set*SchedulerHandler.

Вставлю свои 5 копеек. А может все-таки сначала сделать нормально, а потом уже писать тесты? Если вы мигрируете - в чем смысл поставить в БД все функции саспенд, а потом делать костыли? Вас же не заставляют в БД именно все функции делать саспенд. Сделайте одну, которую нормально дальше использовать сможете, потом другую. Если сервис твой работал на Rx без костылей - оставь на rx, пока не придумаешь что с ним делать. Rx и протестировать легко. В крайнем случае, если ты прям контракт БД менять не можешь - можно саспенд функцию преобразовать в Rx c помошью 'org.jetbrains.kotlinx:kotlinx-coroutines-rx3:1.3.9'.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта