使用带接收器的kotlin扩展功能时的单元测试

时间:2018-02-14 13:52:37

标签: unit-testing kotlin kotlinx.coroutines

在单元测试中是否可以将特定值传递给带接收器的扩展函数?

我正在尝试测试下面的订阅方法

...
private lateinit var subscription: SubscriptionReceiveChannel<UiStateModel>

suspend fun subscribe(model: MainViewModel) {
        subscription = model.connect()
        subscription.consumeEach { value -> loadView(value) /** or loadView(it) */ }
    }

private fun loadView(uiState: UiStateModel) {
        when(uiState) {
            is Loading -> view.isLoading()
            is Error -> view.isError(uiState.exception.localizedMessage)
            is Success -> when {
                uiState.result != null -> view.isSuccess(uiState.result)
                else -> view.isEmpty()
            }
        }
    }

我希望能够将特定值应用于consumeEach函数,但是如何实现呢?

这是我的单元测试:

...
private val view = mock<MainView>()
    private val model = mock<MainViewModel>()
    private val subscription = mock<SubscriptionReceiveChannel<UiStateModel>>()

    private val presenter = MainPresenter(view)

    @Test
    fun `When uistate is loading, view should show loading message`() = runBlocking {
        // Given
        val state = UiStateModel.Loading()
        whenever(model.connect()).thenReturn(subscription)
        whenever(subscription.consumeEach { any() }).thenAnswer({ state })

        // When
        presenter.subscribe(model)

        // Then
        verify(model).connect()
        verify(view).isLoading()
        verify(view, never()).isSuccess(anyString())
        verify(view, never()).isEmpty()
        verify(view, never()).isError(anyString())
    }
...

0 个答案:

没有答案