0

我有在當未登錄用戶的一些菜單項應該被禁用的菜單NavigationView如何測試NavigationView菜單項是禁用還是使用Espresso啓用?

private void setupNavigationViewMenu(boolean isUserLoggedIn) { 
    Menu menu = mNavigationView.getMenu(); 
    menu.findItem(R.id.item_charge_cards).setEnabled(isUserLoggedIn); 
    menu.findItem(R.id.item_charge_sessions).setEnabled(isUserLoggedIn); 
    menu.findItem(R.id.item_invoices).setEnabled(isUserLoggedIn); 
} 

我想創建一個咖啡測試,這將斷言菜單項真正被禁用。

我寫了下面的測試,但它的失敗:

@Test 
public void navigationMenuItems_AreDisabled() { 
    openNavigationDrawer(); 
    onView(getNavigationItemWithString(R.string.navigation_view_item_charging_cards)) 
      .check(matches(not(isEnabled()))); 
    onView(getNavigationItemWithString(R.string.navigation_view_item_charging_sessions)) 
      .check(matches(not(isEnabled()))); 
    onView(getNavigationItemWithString(R.string.navigation_view_item_invoices)) 
      .check(matches(not(isEnabled()))); 
} 

public static Matcher<View> getNavigationItemWithString(String string) { 
    return allOf(isAssignableFrom(AppCompatCheckedTextView.class), withText(string)); 
} 

堆棧跟蹤:

android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'not is enabled' doesn't match the selected view. 
Expected: not is enabled 
Got: "AppCompatCheckedTextView{id=2131624121, res-name=design_menu_item_text, visibility=VISIBLE, width=651, height=126, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=42.0, y=0.0, text=Laadpassen, input-type=0, ime-target=false, has-links=false, is-checked=false}" 
... 

你有什麼建議,如何寫出正確的測試?

回答

1

A NavigationView菜單項不是單個視圖,而是ViewGroup,因此啓用狀態應用於NavigationMenuItemView而不是AppCompatCheckedTextView。爲了解決您的測試問題,您必須使用以下匹配程序在視圖層次結構中查找正確的佈局:

public static Matcher<View> getNavigationItemWithString(String string) { 
    Matcher<View> childMatcher = allOf(isAssignableFrom(AppCompatCheckedTextView.class), withText(string)); 
    return allOf(isAssignableFrom(NavigationMenuItemView.class), withChild(childMatcher)); 
} 
相關問題