我有以下導航圖startDestinationas 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);
因為在TestNavHostController上startDestination。card_list
實際的失敗訊息是
預計:2131296377
但是是:2131296378
在 bbct.android.common.navigation.NavigationTest.clickOnSaveNavigatesFromDetailsBackToList(NavigationTest.java:116)
2131296377是 idcard_list2131296378是 idcard_details- 116行就是前面提到的
assertThat()
如何強制此測驗從正確的目的地開始?或者這不是撰寫這樣一個測驗的正確方法嗎?我是否應該card_details通過執行用戶通常會執行的 UI 操作導航到 first 來撰寫這樣的測驗?
依賴項:
萬一這很重要,我有以下導航依賴版本:
navVersion = '2.4.2'
implementation "androidx.navigation:navigation-fragment:$navVersion"
implementation "androidx.navigation:navigation-ui:$navVersion"
uj5u.com熱心網友回復:
根據測驗導航指南:
就像一個真實的
NavController,你必須呼叫setGraph來初始化TestNavHostController。在這個例子中,被測驗的片段是我們圖表的起始目的地。TestNavHostController提供一種setCurrentDestination方法,允許您設定當前目標(以及可選的該目標的引數),以便NavController在測驗開始之前處于正確狀態。
因此,添加一個呼叫以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);
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/487646.html
