Completable 中的单个 delaySubscription 等价物

Single delaySubscription equivalent in Completable

在我的一个测试中(我是测试新手,欢迎任何反馈)我可以通过调用 delayer.onComplete() 手动触发 Single 的完成。有了这个,我可以测试 loadingObservable: LiveData<Boolean> 在进行网络请求时是否设置为 true,在完成时是否设置为 false。我怎样才能用 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()
}

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

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

否则,您必须通过 andThen:

模拟 delaySubscription
delayer.ignoreElements().andThen(Completable.complete())