代码之家  ›  专栏  ›  技术社区  ›  Antek

使用Rx链接时Android测试失败

  •  2
  • Antek  · 技术社区  · 6 年前

    dao.insert(position) 收益率 Unit (“ Void “” dao.getPosition() 收益率 Single<IssPosition> . dbFailingTest 失败,出现以下异常 Query returned empty result set: SELECT * FROM iss_position LIMIT 1 (但如果我把参数改为,比如, id = 1 )我在使用房间。

    为什么第一次考试不及格,第二次考试不及格?我相信它们是等价的,但它们显然不是。我希望我的代码最终看起来更像失败的测试,因为在我的repo中,我也将订阅一些外部事件。

    @Test
    fun dbFailingTest() {
        Completable
                .fromCallable { dao.insert(position) }
            //    .delay(1, TimeUnit.SECONDS)
                .to {
                    dao.getPosition()
                }
                .test()
               // .awaitDone(1200, TimeUnit.MILLISECONDS)
                .assertResult(position)
    }
    
    @Test
    fun dbPassingTest() {
        dao.insert(position)
        dao.getPosition()
                .test()
                .assertResult(position)
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Slav    6 年前

    方法 to 皈依者 Completable 去做其他事情,而不等待前者完成。它只执行作为参数传递的函数,使用 可完成的 作为一个论点。

    另一方面,如果你使用 Single :

    @Test
    fun dbFailingTest() {
        Single
                .fromCallable { dao.insert(position) }
                .flatMapMaybe { dao.getPosition() }
                .test()
                .assertResult(position)
    }
    

    flatMapMaybe 转换 结果 单一的 所以它必须等待 单一的 待完成。

    此外,如果您使用 InstantTaskExecutorRule 在你的测试课上:

    @Rule
    @JvmField
    val instantTaskExecutorRule = InstantTaskExecutorRule()
    

    此代码应该有效:

    @Test
    fun dbFailingTest() {
        dao.insert(position)
        dao.getPosition()
            .test()
            .assertResult(position)
    }