【问题标题】:Basic testing NavigationController in AndroidAndroid中的基本测试NavigationController
【发布时间】:2020-12-03 01:51:52
【问题描述】:

我目前是测试新手,所以我决定从一些基本的东西开始。

我从连接到 ActivityDrawerLayout 处理所有导航。

因此,对于我的测试,我启动了一个 ActivityScenarioRule,创建了一个 testNavController 对象,然后将此 testNavController 设置为处理导航的当前视图(容器片段)。

所以测试包括打开抽屉点击菜单项(将导航到片段),因此检查是否导航到片段。

然后我检查是否发生了这种情况,但是 testNavController 停留在同一个目的地这很奇怪,因为它执行了点击,所以我决定检查 navController (活动中的真实片段)它向我展示了导航到正确的片段。

这是所需的代码:

@LargeTest
@RunWith(AndroidJUnit4::class)
class MapsActivityTest {
    @get:Rule
    var activityScenarioRule = ActivityScenarioRule(MapsActivity::class.java)

    @Test
    fun clickOnDrawerMaps_NavigateToAboutAppFragment() {
        //Create TestNavHostController
        val testNavController = TestNavHostController(ApplicationProvider.getApplicationContext())

        UiThreadStatement.runOnUiThread { // This needed because it throws a exception that method addObserver must be called in main thread
            testNavController.setGraph(R.navigation.nav_graph)
        }
        
        val scenario = activityScenarioRule.scenario
        var navcontroller : NavController? = null
        scenario.onActivity {mapsActivity ->
            navcontroller = mapsActivity.navController //Get the real navController just to debug
            mapsActivity.navController = testNavController //Set the test navController
            Navigation.setViewNavController(mapsActivity.binding.containerFragment, testNavController)
        }

        onView(withId(R.id.drawerLayout)).perform(DrawerActions.open()).check(matches(isOpen()))
        onView(withId(R.id.aboutAppFragment)).perform(click())
        assertThat(testNavController.currentDestination?.id).isEqualTo(R.id.aboutAppFragment)
    }
}

在示例中他们使用了 Fragment,他们在 Fragment 启动时设置了 fragment.requireView(),但我认为它完全一样。

我在这里做错了什么?

【问题讨论】:

  • 如果您的活动已经有一个真正的NavController,那么您是否有理由使用TestNavHostController
  • 我开始测试时的猜测是在测试中使用“假”而不是“真实”的东西,只是为了更好的实践,但我又一次开始测试,我超级无知!所以我猜我们只在使用片段时设置 TestNavController 因为活动是空的,对吧? @ianhanniballake

标签: android testing android-espresso instrumented-test


【解决方案1】:

当您使用ActivityScenario(或ActivityScenarioRule)时,您的活动会一直处于恢复状态,然后才会进行任何onActivity 调用。这意味着当您调用setupWithNavController 时,您的真实NavController 已经创建并使用。这就是您拨打setViewNavController() 无效的原因。

对于这些类型的集成测试(你有一个真正的NavController),你不应该使用TestNavHostController

根据Test Navigation guideTestNavHostController 专为单元测试而设计,您根本没有任何真正的NavController,例如在单独测试一个片段时。

【讨论】:

  • 现在很有意义!非常感谢您的解释:-)
猜你喜欢
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
相关资源
最近更新 更多