Как протестировать LiveData.asFlow().collect() и надежно проверить вызов метода внутри него? ⇐ Android
-
Гость
Как протестировать LiveData.asFlow().collect() и надежно проверить вызов метода внутри него?
Я пытаюсь протестировать класс, который принимает объект LiveData, преобразует его в поток, собирает его и на основе результата выполняет действие.
В основном коде все работает так, как и ожидалось, но я не могу понять, как это проверить. Похоже, что проверка того, что блок кода внутри collect происходит, никогда не достигается, и тест ложно проходит.
Это моя настройка:
class LiveDataClass { весело liveData(): LiveData { вернуть MutableLiveData (истина) } весело сделать что-нибудь() {} fun decoyMethod() {} // чтобы проверить, вызывается ли он в тесте, просто чтобы он провалился } Класс, собирающий поток:
class FlowClass(private val liveDataClass: LiveDataClass) { приостановить веселье doSomethingWhenLiveDataIsTrue() { liveDataClass.liveData().asFlow().collect { если оно) { println("Внутри коллекции") liveDataClass.doSomething() // здесь, в тесте, мы достигаем кода } } } } И тест — я просмотрел несколько примеров настройки, чтобы избежать ошибок, и хотя этот тест проходит, и я вижу liveDataClass.doSomething() вызывается, проверка никогда не происходит.
Я проверяю, вызывается ли когда-либо liveDataClass.decoyMethod() (что на самом деле не так), и тест все еще в порядке...
class FlowClassTest { @get:Правило val InstantTaskExecutorRule: TestRule = InstantTaskExecutorRule() частный диспетчер val = StandardTestDispatcher() частный val testScope = TestScope (диспетчер) @До забавная установка() { Dispatchers.setMain(диспетчер) } @После весело слеза вниз() { Диспетчеры.resetMain() } @Тест веселый тест() = runTest { testScope.launch { println("Запуск тестового примера") val liveDataClass: LiveDataClass = макет { каждый { liveData() } возвращает MutableLiveData(true) каждый { doSomething() } отвечает { println("ТЕСТ - Делаем что-то") } } valflowClass = FlowClass(liveDataClass) flowClass.doSomethingWhenLiveDataIsTrue() verify { // никогда не происходит, и тест проходит, хотя и не должен! println("Проверка") liveDataClass.decoyMethod() } } } } Как настроить этот тест, чтобы он был действительно полезен и правильно проверял вызовы?
Я пытаюсь протестировать класс, который принимает объект LiveData, преобразует его в поток, собирает его и на основе результата выполняет действие.
В основном коде все работает так, как и ожидалось, но я не могу понять, как это проверить. Похоже, что проверка того, что блок кода внутри collect происходит, никогда не достигается, и тест ложно проходит.
Это моя настройка:
class LiveDataClass { весело liveData(): LiveData { вернуть MutableLiveData (истина) } весело сделать что-нибудь() {} fun decoyMethod() {} // чтобы проверить, вызывается ли он в тесте, просто чтобы он провалился } Класс, собирающий поток:
class FlowClass(private val liveDataClass: LiveDataClass) { приостановить веселье doSomethingWhenLiveDataIsTrue() { liveDataClass.liveData().asFlow().collect { если оно) { println("Внутри коллекции") liveDataClass.doSomething() // здесь, в тесте, мы достигаем кода } } } } И тест — я просмотрел несколько примеров настройки, чтобы избежать ошибок, и хотя этот тест проходит, и я вижу liveDataClass.doSomething() вызывается, проверка никогда не происходит.
Я проверяю, вызывается ли когда-либо liveDataClass.decoyMethod() (что на самом деле не так), и тест все еще в порядке...
class FlowClassTest { @get:Правило val InstantTaskExecutorRule: TestRule = InstantTaskExecutorRule() частный диспетчер val = StandardTestDispatcher() частный val testScope = TestScope (диспетчер) @До забавная установка() { Dispatchers.setMain(диспетчер) } @После весело слеза вниз() { Диспетчеры.resetMain() } @Тест веселый тест() = runTest { testScope.launch { println("Запуск тестового примера") val liveDataClass: LiveDataClass = макет { каждый { liveData() } возвращает MutableLiveData(true) каждый { doSomething() } отвечает { println("ТЕСТ - Делаем что-то") } } valflowClass = FlowClass(liveDataClass) flowClass.doSomethingWhenLiveDataIsTrue() verify { // никогда не происходит, и тест проходит, хотя и не должен! println("Проверка") liveDataClass.decoyMethod() } } } } Как настроить этот тест, чтобы он был действительно полезен и правильно проверял вызовы?
Мобильная версия