当前位置: 首页 > 知识库问答 >
问题:

单元测试coroutines RunBlockingTest:此作业尚未完成

甄正信
2023-03-14
override suspend fun signUp(authentication: Authentication): AuthenticationError {
    return suspendCancellableCoroutine {
        auth.createUserWithEmailAndPassword(authentication.email, authentication.password)
            .addOnCompleteListener(activityLifeCycleService.getActivity()) { task ->
                if (task.isSuccessful) {
                    it.resume(AuthenticationError.SignUpSuccess)
                } else {
                    Log.w(this.javaClass.name, "createUserWithEmail:failure", task.exception)
                    it.resume(AuthenticationError.SignUpFail)
                }
            }
    }
}

现在我想对这个函数进行单元测试。我正在使用Mockk:

  @Test
  fun `signup() must be delegated to createUserWithEmailAndPassword()`() = runBlockingTest {

      val listener = slot<OnCompleteListener<AuthResult>>()
      val authentication = mockk<Authentication> {
        every { email } returns "email"
        every { password } returns "pswd"
      }
      val task = mockk<Task<AuthResult>> {
        every { isSuccessful } returns true
      }

      every { auth.createUserWithEmailAndPassword("email", "pswd") } returns
          mockk {
            every { addOnCompleteListener(activity, capture(listener)) } returns mockk()
          }

    service.signUp(authentication)

      listener.captured.onComplete(task)
    }

不幸的是,由于以下异常,此测试失败:java.lang.IllegalStateException:此作业尚未完成

我尝试用runblocking替换runblockingtest,但测试似乎在无限循环中等待。

有人能帮我弄一下这个吗?

提前致谢

共有1个答案

轩辕瑞
2023-03-14

在这篇帖子中可以看到:

这个异常通常意味着您的测试中的一些协程被安排在测试范围之外(更具体地说是测试调度程序)。

而不是执行以下操作:

private val networkContext: CoroutineContext = TestCoroutineDispatcher()

private val sut = Foo(
  networkContext,
  someInteractor
)

fun `some test`() = runBlockingTest() {
  // given
  ...

  // when
  sut.foo()

  // then
  ...
}
private val testDispatcher = TestCoroutineDispatcher()
private val testScope = TestCoroutineScope(testDispatcher)
private val networkContext: CoroutineContext = testDispatcher

private val sut = Foo(
  networkContext,
  someInteractor
)
fun `some test`() = testScope.runBlockingTest {
  ...
}

 类似资料:
  • 我想编写一个单元测试,检查调用是否不是从触发器发出的 我知道如何通过实现HttpCalloutMock来测试调用是否正确: 但是如果没有发出HTTP请求,那么就不会调用响应()方法。所以这种方法根本不会测试请求是否发出。 我需要这样的东西: 我该怎么做?

  • 问题内容: 我正在尝试建立反应的单元测试框架。这样做时,发生以下错误。我搜索了整个互联网,但没有有效的解决方案。下面是显示的错误和我正在使用的代码/软件包。 调试错误 节点包 karma.conf.js 测试/ test.js 非常感谢您的帮助! 问题答案: 当您以CommonJS形式()而不是AMD形式()进行调用时,您所描述的错误正是RequireJS给您的, 并且 调用没有被封装进来。Req

  • 我正在设置我的第一个Jenkins服务器来构建和测试现有的maven项目,而jenkins无法完成单元测试。 当我从命令行运行“mvn清洁安装”时,所有模块都会构建并通过它们的单元测试。然而,Jenkins只能运行第一组单元测试(通过),然后以某种方式出错。 我用的是詹金斯1.499。 以下是来自顶级pom报告插件的一些相关信息:

  • Android Studio 1.1 添加了单元测试支持,详细请看 Unit testing support。本章的其余部分描述的是 “instrumentation tests”。利用 Instrumentation 测试框架可以构建独立的测试 APK 并运行在真实设备(或模拟器)中进行测试。

  • 英文原文:http://emberjs.com/guides/testing/unit/ 单元测试用于测试代码的一个小片段,确保其功能正常。与集成测试不同,单元测试被限定在一个范围内,并且不需要Ember应用运行。 全局 vs 模块 过去如果没有作为一个全局变量加载整个Ember应用,要对应用进行测试非常困难。通过使用模块(CommonJS,AMD等)来编写应用,可以只加载被测试的部分,而不用将其

  • 我在单元测试(用C#编写)中存根了必要的方法等,但问题是在断言测试之前异步操作没有完成。 我怎么才能绕过这个?我应该创建一个模拟TaskFactory或任何其他技巧来单元测试异步操作吗?