繁体   English   中英

如何测试是否使用Espresso禁用或启用了NavigationView菜单项?

[英]How to test if a NavigationView menu item is disabled or enabled with Espresso?

我有一个带有菜单的NavigationView ,其中在用户未登录时应禁用某些菜单项:

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);
}

我想创建一个Espresso测试,它将断言菜单项确实被禁用。

我已经编写了以下测试,但是失败了:

@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}"
...

您对如何编写正确的测试有任何建议吗?

NavigationView菜单项不是单个视图,而是ViewGroup,因此启用状态将应用于NavigationMenuItemView ,而不是AppCompatCheckedTextView 为了修复您的测试,您必须使用以下Matcher在视图层次结构中找到正确的布局:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM