我有以下导航图startDestination
作为card_list
:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/card_list">
<fragment
android:id="@+id/card_list"
android:name="bbct.android.common.fragment.BaseballCardList"
android:label="@string/app_name"
tools:layout="@layout/card_list">
<action
android:id="@+id/action_details"
app:destination="@id/card_details" />
</fragment>
<fragment
android:id="@+id/card_details"
android:name="bbct.android.common.fragment.BaseballCardDetails"
android:label="@string/card_details_title"
tools:layout="@layout/card_details">
<argument
android:name="id"
app:argType="long" />
</fragment>
</navigation>
现在我想从card_details
开始编写一个测试:
public class NavigationTest {
@Test
public void clickOnSaveNavigatesFromDetailsBackToList() {
TestNavHostController navController = new TestNavHostController(ApplicationProvider.getApplicationContext());
FragmentScenario<BaseballCardDetails> listScenario = FragmentScenario.launchInContainer(
BaseballCardDetails.class,
null,
R.style.AppTheme
);
listScenario.onFragment(fragment -> {
navController.setGraph(R.navigation.nav_graph);
Navigation.setViewNavController(fragment.requireView(), navController);
});
assertThat(Objects.requireNonNull(navController.getCurrentDestination()).getId())
.isEqualTo(R.id.card_details);
BaseballCard card = new BaseballCard(
true,
"Mint",
"Code Guru Apps",
1993,
"1",
50000,
1,
"Code Guru",
"Code Guru Devs",
"Catcher"
);
BBCTTestUtil.sendKeysToCardDetails(card);
Espresso.onView(ViewMatchers.withId(R.id.save_button)).perform(ViewActions.click());
assertThat(Objects.requireNonNull(navController.getCurrentDestination()).getId())
.isEqualTo(R.id.card_list);
}
}
这失败于
assertThat(Objects.requireNonNull(navController.getCurrentDestination()).getId())
.isEqualTo(R.id.card_details);
because theTestNavHostController
is on thestartDestination
ofcard_list
.
实际的失败消息是
预期:2131296377
但是:2131296378
在 bbct.android.common.navigation.NavigationTest.clickOnSaveNavigatesFromDetailsBackToList (NavigationTest.java:116)
2131296377
is the id forcard_list
2131296378
is the id forcard_details
第 116 行是前面提到的assertThat()
我应该通过首先执行用户通常会执行的 UI 操作来导航到card_details
来编写这样的测试吗?
依赖关系:
如果它很重要,我有以下导航依赖版本:
navVersion = '2.4.2'
implementation "androidx.navigation:navigation-fragment:$navVersion"
implementation "androidx.navigation:navigation-ui:$navVersion"
就像真正的NavController
一样,您必须调用setGraph
来初始化TestNavHostController
。在这个例子中,正在测试的片段是我们的图的开始目标。TestNavHostController
提供了一个setCurrentDestination
方法,允许您设置当前目标(以及可选的该目标的参数),以便0
所以添加一个调用setCurrentDestination
来初始化你的测试在一个特定的目的地:
listScenario.onFragment(fragment -> {
navController.setGraph(R.navigation.nav_graph);
// Create arguments using Safe Args generated classes
// or construct the Bundle directly
BaseballCardDetailsArgs args = new BaseballCardDetailsArgs.Builder(0).build();
Bundle arguments = args.toBundle();
// Then set the current destination to your card_details
navController.setCurrentDestination(R.id.card_details, arguments);
Navigation.setViewNavController(fragment.requireView(), navController);
});
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(24条)