2017-04-05 36 views
3

我写UI自动化测试在咖啡为Android &跨为此,我还没有得到任何解决方案迄今的情景来。如何检查菜单项在咖啡UI自动化启用/禁用测试

在一个Fragment,我有OptionsMenu用一个单一的项目。 MenuItem的状态根据API响应中的值设置。

@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 
    menu.clear(); 
    getActivity().getMenuInflater().inflate(R.menu.menu_cancel_order, menu); 
    MenuItem cancelMenuItem = menu.findItem(R.id.cancel_order); 
    if(something) { // something can be a boolean value from server 
     cancelMenuItem.setEnabled(true); 
    } else { 
     cancelMenuItem.setEnabled(false); 
    } 
} 

对于UI测试,我需要编写测试用例来检查这个MenuItem是否启用/禁用。

对于点击overflowmenu,

ViewInteraction actionMenuItemView = onView(
      allOf(withId(R.id.action_settings), withContentDescription("Settings"), isDisplayed())); 
actionMenuItemView.perform(click()); 

到目前为止我曾尝试检查断言如下。

onView(allOf(withText("Cancel Order"), withId(R.id.cancel_order))).check(matches(not(isEnabled()))); 

但这触发NoMatchingViewException有消息

NoMatchingViewException:在体系中没有的观点找到匹配:(与 文字:是 “取消订单”,并与ID: com.equinix.ecp.betatest :ID/cancel_order)

所以我试图将其更改为

onView(allOf(withText("Cancel Order"))).check(matches(not(isEnabled()))); 

不知怎的,这相匹配的观点,但它不是一个菜单项,但菜单项&内TextView的,因为我设置setEnabled()到菜单项,check()断言不会按预期工作,因为它是一个TextView

所以我的问题是怎么写的测试检查菜单项的启用/禁用状态。

+0

你找到了一个解决方案?我有同样的情况。 – makovkastar

+0

@makovkastar其实不是。但是我所做的就是,不是检查菜单项的启用/禁用,而是对菜单项执行单击操作,并检查下一页中的项是否不显示。因此,如果项目不显示,那就意味着没有执行点击操作,这意味着菜单被禁用。不完美,但现在这是我做的。等待完美的解决方案 – sJy

回答

0

我会建议你使用菜单项的ID来执行你的支票。 我与此菜单试了一下:

所以一个菜单项启用
<menu 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" 
tools:context="at.hellobank.hellomarkets.symbols.DetailActivity"> 

<item 
    android:id="@+id/action_1" 
    android:icon="@android:drawable/arrow_down_float" 
    android:title="Menu1" 
    app:showAsAction="always" /> 

<item 
    android:id="@+id/action_2" 
    android:enabled="false" 
    android:icon="@android:drawable/arrow_down_float" 
    android:title="Menu2" 
    app:showAsAction="always" /> 
</menu> 

一个被禁用。我的测试,以检查这看起来像这一点,并正在按预期:

@Test 
public void testMenuItemsStatus() throws Exception { 
    onView(withId(R.id.action_1)).check(matches(isEnabled())); 
    onView(withId(R.id.action_2)).check(matches(not(isEnabled()))); 
} 

一般使用的ID在测试中更好恕我直言,因为你更独立的错别字和通用语言。 withText("Cancel Order")如果您测试使用其他语言本地化的应用程序,则可能无法正常工作。

+0

谢谢你的回答。我已经尝试过使用ID,但在这种情况下我得到了Exception。此外,我的菜单项xml与您在答案中使用的不同。 'action_settings'是主要项目ID和里面,我有子菜单项ID'cancel_order'&showAsAction =“ifRoom” – sJy

相关问题