2015-05-20 17 views
6

Cách tốt nhất để kiểm tra và khẳng định rằng chế độ xem danh sách là kích thước mong đợi với máy pha cà phê espresso android là gì?Xác định số lượng mục phù hợp trong danh sách với espresso

Tôi đã viết đối sánh này, nhưng không biết cách tích hợp nó vào thử nghiệm.

public static Matcher<View> withListSize (final int size) { 
    return new TypeSafeMatcher<View>() { 
     @Override public boolean matchesSafely (final View view) { 
      return ((ListView) view).getChildCount() == size; 
     } 

     @Override public void describeTo (final Description description) { 
      description.appendText ("ListView should have " + size + " items"); 
     } 
    }; 
} 
+0

Nếu cà phê espresso ngon, mọi thứ trong danh sách không quan trọng. Bây giờ đi cho một. –

Trả lời

13

Đã tìm ra điều này.

class Matchers { 
    public static Matcher<View> withListSize (final int size) { 
    return new TypeSafeMatcher<View>() { 
     @Override public boolean matchesSafely (final View view) { 
     return ((ListView) view).getCount() == size; 
     } 

     @Override public void describeTo (final Description description) { 
     description.appendText ("ListView should have " + size + " items"); 
     } 
    }; 
    } 
} 

Nếu mong đợi một mục trong danh sách, hãy đặt điều này trong tập lệnh thử nghiệm thực tế.

onView (withId (android.R.id.list)).check (ViewAssertions.matches (Matchers.withListSize (1))); 
+0

Tôi dường như không thể tìm thấy phương thức Matchers.withListSize (1) ... bạn có thể cho tôi biết toàn bộ classpath và có lẽ phiên bản phù hợp của Matchers không? – gleenn

+0

Phương pháp này nằm trong câu hỏi và được viết bởi tôi. Đặt nó vào lớp Matchers của riêng bạn. –

+0

Phương pháp này nằm trong câu hỏi và được viết bởi tôi. Đặt nó vào lớp Matchers của riêng bạn. Tôi đã thêm nó vào câu trả lời ngay bây giờ. Bạn có thể cần phải làm cho lớp công khai tùy thuộc vào nơi bạn đặt nó liên quan đến kịch bản thử nghiệm espresso của bạn. –

4

Có hai phương pháp khác nhau để nhận được sản phẩm đếm trong một danh sách với espresso: Đầu tiên là như @CoryRoy nêu trên - sử dụng TypeSafeMatcher, một trong những khác là sử dụng BoundedMatcher.

Và bởi vì @CoryRoy đã cho thấy cách xác nhận điều đó, ở đây tôi muốn nói cách nhận (trả lại) số sử dụng các trình so khớp khác nhau.

public class CountHelper { 

    private static int count; 

    public static int getCountFromListUsingTypeSafeMatcher(@IdRes int listViewId) { 
     count = 0; 

     Matcher matcher = new TypeSafeMatcher<View>() { 
      @Override 
      protected boolean matchesSafely(View item) { 
       count = ((ListView) item).getCount(); 
       return true; 
      } 

      @Override 
      public void describeTo(Description description) { 
      } 
     }; 

     onView(withId(listViewId)).check(matches(matcher)); 

     int result = count; 
     count = 0; 
     return result; 
    } 

    public static int getCountFromListUsingBoundedMatcher(@IdRes int listViewId) { 
     count = 0; 

     Matcher<Object> matcher = new BoundedMatcher<Object, String>(String.class) { 
      @Override 
      protected boolean matchesSafely(String item) { 
       count += 1; 
       return true; 
      } 

      @Override 
      public void describeTo(Description description) { 
      } 
     }; 

     try { 
      // do a nonsense operation with no impact 
      // because ViewMatchers would only start matching when action is performed on DataInteraction 
      onData(matcher).inAdapterView(withId(listViewId)).perform(typeText("")); 
     } catch (Exception e) { 
     } 

     int result = count; 
     count = 0; 
     return result; 
    } 

} 

Cũng muốn đề cập rằng bạn nên sử dụng ListView#getCount() thay vì ListView#getChildCount():

  • getCount() - số mục dữ liệu thuộc sở hữu của Adaptor, mà có thể lớn hơn số lượng ảnh nhìn thấy được.
  • getChildCount() - số lượng trẻ em trong ViewGroup, có thể được sử dụng lại bởi ViewGroup.
Các vấn đề liên quan