2016-08-18 39 views
1

我有一個ListFragment的活動。 我需要實施的場景(在Espresso的幫助下):如何斷言數據項不在帶Espresso的ListFragment中?

  1. 在ListFragment中添加新項目。
  2. 檢查它顯示。
  3. 刪除該項目。
  4. 檢查它沒有顯示。

我有第四點的問題。 我已閱讀文章[https://google.github.io/android-testing-support-library/docs/espresso/advanced/#asserting-that-a-view-is-not-present][1]

作者recomends實現匹配:

private static Matcher<View> withAdaptedData(final Matcher<Object> dataMatcher) { 
     return new TypeSafeMatcher<View>() { 
    @Override 
    public void describeTo(Description description) { 
     description.appendText("with class name: "); 
     dataMatcher.describeTo(description); 
    } 

    @Override 
    public boolean matchesSafely(View view) { 
     if (!(view instanceof AdapterView)) { 
     return false; 
     } 
     @SuppressWarnings("rawtypes") 
     Adapter adapter = ((AdapterView) view).getAdapter(); 
     for (int i = 0; i < adapter.getCount(); i++) { 
     if (dataMatcher.matches(adapter.getItem(i))) { 
      return true; 
     } 
     } 
     return false; 
    } 
    }; 
} 

,然後調用:

onView(withId(R.id.list)) 
     .check(matches(not(withAdaptedData(withItemContent("item: 168"))))); 

的問題是,在我的情況我沒有適配器視圖。我在函數中使用Id()傳遞ListFragment的id。所以匹配器不起作用。 問題是如何將withAdaptedData的代碼更改爲與ListFragment一起使用?或者,也許有,還有另一種方法來解決我的任務?

回答

0

不幸的是,我沒有找到比不使用Espresso解決這個問題更好的東西。我只是實現了檢查數據不在ListFragment中的方法。

private void checkDataNotExistInList(String text) { 
     MyListFragment myListFragment = (MyListFragment)mActivity.getFragmentManager() 
       .findFragmentById(R.id.frgMyList); 
     assertNotNull(myListFragment); 
     ListAdapter listAdapter = (ListAdapter) myListFragment.getListAdapter(); 
     for (int i = 0; i < listAdapter.getCount(); i++) { 
      assertThat("Item is in the list", text, is(not(listAdapter.getItem(i).getName())));     
     } 
    } 

但我相信有更好的解決方案。