测试暂停corotuine

时间:2018-05-07 18:49:03

标签: android kotlin kotlinx.coroutines

我正在尝试使用协同程序来处理我的登录服务的异步代码。不幸的是,登录服务的实现必须在完成后接受回调。我不希望这个login()函数完成,直到发生其中一个回调。

这就是我所拥有的:

fun login(): Outcome = runBlocking {
    suspendCoroutine<Outcome> { continuation ->
        loginService.login(
                onLoginSuccess = {
                    // do some stuff
                    continuation.resume(Outcome.SUCCESS)
                },
                onLoginFailure = {
                    // handle failure case
                    continuation.resume(Outcome.FAILURE)
                }
        )
    }
}

我的问题是我的测试永远不会完成。我认为正在发生的事情是延续块本身没有运行。我也尝试在runBlocking中将调用包装到uut.login(),但它没有帮助。这是我的测试代码(使用Spek):

describe("when login") {

    val successCaptor: ArgumentCaptor<() -> Unit> = TestHelpers.argumentCaptorForClass()
    val failureCaptor: ArgumentCaptor<() -> Unit> = TestHelpers.argumentCaptorForClass()

    var result: Outcome? = null

    beforeEachTest {
        doNothing().whenever(mockLoginService)?.login(capture(successCaptor), capture(failureCaptor))
        result = uut?.execute()
    }

    it("logs in with the login service") {
        verify(mockLoginService)?.login(any(), any())
    }

    describe("and the login succeeds") {

        beforeEachTest {
            successCaptor.value.invoke()
        }

        // other tests...

        it("returns an outcome of SUCCESS") {
            expect(result).to.equal(Outcome.SUCCESS)
        }
    }

    describe("and the login fails") {
        beforeEachTest {
            failureCaptor.value.invoke()
        }

        // other tests...

        it("returns an outcome of FAILURE") {
            expect(result).to.equal(Outcome.FAILURE)
        }
    }
}

基本上,我想断言login()方法根据发生的情况返回SUCCESS或FAILURE结果。

有什么想法吗?

0 个答案:

没有答案