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

Ребят помогите плз, как тестировать подобные методы? bookPreviewEntities - приватное

поле,и я не могу его задать через конструктор. Поэтому в тестах оно всгеда null и логика не тестируется.

41 ответов

14 просмотров

Я вижу это так: штука приватная, а замокать ее надо. Значит передай ее в конструктор?

Dmitry Levchenko- Автор вопроса

Да, можно так.Но тогда мне придётся менять код конструктора,и зачем-то передавать в презентер данные,которыми активити не распологает

Dmitry Levchenko- Автор вопроса

Если менять код-я мог бы это поле и пабликом сделать на время теста, но разве мы должны подгонять код под тесты?

Нет, не должны. Но передавать зависимости в конструктор - это как раз норма. Особенно если мокать их придётся

А что оно вообще такое, это поле?

Dmitry Levchenko- Автор вопроса

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

А много ты над ними действий в презенторе делаешь?

Dmitry Levchenko- Автор вопроса

вообще я думал, так и поступлю. Примерны с передачей репозитория и прочего в конструктор казались очевидными, а вот о том чтобы вообще всёё передавать через конструктор я не думал.

Dmitry Levchenko- Автор вопроса

в основном конвертирую даблы в строки для отображения во view и т.д,а что ?

Я посмотрел еще на тот скриншот. Слушай, ты там за viewState дергаешь, так? Оставляй все как есть и просто введи проверку, что нет исключений и за нужный метод viewState ты дернул

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

Dmitry Levchenko- Автор вопроса

да но просто метод addBook вызывается не только из этой паблик функции. И следовательно я каждый раз должен писать один и тот же код,тестирующий вызовы view?

Dmitry Levchenko- Автор вопроса

Просто я видел точку зрения,что мы содержание приват методов вообще смотреть не должны, чтобы не зависеть от реализации

Так а как по тому скрину понять, что метод приватный?)

Dmitry Levchenko- Автор вопроса

по скрину никак)) но я в сообщении к скрину это написал

Я про onBookDismiss. Он приватный?

Dmitry Levchenko- Автор вопроса

не, он паблик

ну вот с ним можно попробовать вариант, что я предложил

Dmitry Levchenko- Автор вопроса

а всё,сорри,я подумал ты про второй скрин говорить начал. С первым скрином вроде всё понятно.Правда вопрос - получается по хорошему, у нас вообще не должно быть private полей,которые мы не задаём через конструктор? То есть в котллине у на всё будет а-ля class Foo(private val field1, private val field2..)?

Почему, нет. Всякую логику (ссылки на репы, интеракторы/юзкейсы) будешь через конструктор передавать - чтобы заменять их поведение на тестах. А какие-то там внутренние списки или еще что будут приватными. Я вот задумался, как это с MVP провернуть. Потому что на MVMM у тебя ViewModel меняет стейт обозреваемых контейнеров - ты просто слушаешь изменения стейта в тестах и сверяешь с желаемым. Тут бы я смотрел вызова методов viewState и сравнивал с желаемыми параметрами. Типа, тебе надо вход-выход для тестов сопостовлять в любом случае, просто найди свой 'return' и смотри, что ты там получишь

Dmitry Levchenko- Автор вопроса

так подожди, если у меня будет хоть 1 внутренняя приватная переменная, я не смогу протестить метод который к ней обращается. И ведь в данном случае у меня и есть внутренний список,который ты предлагаешь через конструктор передавать.

Нет, я не знал, что это список обычный, так что забыли про эту идею. Тебе не нужно каждый чих тестить, я считаю. Смотришь ты на этот метод, не зная реализации, и что ждешь? Что он изменит состояние view. И через какой метод view он это сделает, верно?

Dmitry Levchenko- Автор вопроса

да,я понимаю.Но проблема в том,что если создать объект презентера для теста, там этот список будет инициализирован null. Соответственно если посмотреть 1 скрин, можно увидеть,что ни одна функция не будет вызвана.

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

Dmitry Levchenko- Автор вопроса

да,у меня этот список инициализируется, когда активити в onCreate вызывает нужный метод у презентера,а потом цепочка вызовов.

Создавай список при инициализации класса, все равно он у тебя мутабельный

Dmitry Levchenko- Автор вопроса

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

Прочитай сообщение над моим прошлым. Там человек простыми слоавми за это дело поясняет

Dmitry Levchenko- Автор вопроса

там человек объяснил 2 проблему, я скоре про случаи вроде этого. Ну или более сложные условия,связанные с предыдущей работой класса

Не понял пока

Dmitry Levchenko- Автор вопроса

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

Так и в жизни так же - никакая логика не, если пользователь не открыл книгу

Dmitry Levchenko- Автор вопроса

но ведь меня ещё интересует, корректна ли логика внутри этой проверки. Как написать тест для случая, когда какая-то книга была открыта.

Проведи "подготовку" объекта - дерни метод "книга открыта"

Dmitry Levchenko- Автор вопроса

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

Да

Да. Имхо, не стоит завязывать тест на внутреннюю реализацию класса. У тебя есть класс - как черный ящик с публичными методами для взаимодействия. Дергаешь эти методы в разном порядке, подаёшь на вход разные данные и смотришь что получилось на выходе.

Dmitry Levchenko- Автор вопроса

Ух,да теперь вроде всё понятно, кроме предыдущего вопроса. Чем 3 приватных поля со скрина выше отличаются от зависимостей? Ведь я не могу передать им значение через конструктор и потому замокать

Ну вообще можешь и передать через конструктор если надо замокать)

Dmitry Levchenko- Автор вопроса

Просто для тестов это кажется мега удобно, минимум кода, но с точки зрения сути класса, странно пихать в конструктор такие поля

Dmitry Levchenko- Автор вопроса

кстати а если серьёзно, насчёт переноса приватных полей в конструктор на kotlin. В плане использования в коде разницы ведь никакой, точно так же инициализируешь поле дефолтным значениемю.Зато мокать можешь. Такой подход юзают вообще?

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
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
Карта сайта