首页 > 解决方案 > Completable 中的单个 delaySubscription 等效项

问题描述

在我的一个测试中(我是测试新手,欢迎任何反馈)我可以Single通过调用手动触发 a 的完成delayer.onComplete()。有了这个,我可以测试loadingObservable: LiveData<Boolean>在进行网络请求时是否设置为真,在完成时是否设置为假。我怎样才能达到同样的效果Completable

// This test works fine
@Test
fun repositoryGetAllCategoriesBeforeItEnds_loadingObservableValueIsTrue() {
    // Arrange
    val delayer = PublishSubject.create<Void>()
    `when`(categoryRepositoryImpl.getAllCategories()).thenReturn(Single.just(categoryResponse)
        .delaySubscription(delayer))

    // Act
    val categoryViewModel = CategoryViewModel(categoryRepositoryImpl, networkUtils)

    // Assert
    assertEquals(true, categoryViewModel.loadingObservable.value)

    delayer.onComplete()
}

// This test does not compile in the line mentioned below
@Test
fun repositoryPostCategoryBeforeItEnds_loadingObservableValueIsTrue() {
    // Arrange
    val delayer = PublishSubject.create<Void>()
    `when`(categoryRepositoryImpl.getAllCategories()).thenReturn(Single.just(categoryResponse))
    `when`(categoryRepositoryImpl.postCategory(any()))
        .thenReturn(Completable.complete().delaySubscription(delayer)) // <-- THIS LINE DOES NOT COMPILE

    // Act
    val categoryViewModel = CategoryViewModel(categoryRepositoryImpl, networkUtils)
    categoryViewModel.newCategory("new category")

    // Assert
    assertEquals(true, categoryViewModel.loadingObservable.value)

    delayer.onComplete()
}

标签: androidkotlinrx-java2

解决方案


您可以将主题转换为可完成:

`when`(categoryRepositoryImpl.postCategory(any()))
    .thenReturn(delayer.ignoreElements())

否则,您必须模拟delaySubscriptionvia andThen

delayer.ignoreElements().andThen(Completable.complete())

推荐阅读