2016-05-24 22 views
6

Có khả năng nào trong số espresso để kiểm tra tất cả các chế độ xem trong listview, không phải để có được một cái từ điều này, nhưng để kiểm tra tất cả cho một số điều kiện.Espresso kiểm tra tất cả trong danh sách

Dường như onData() phục vụ để trả về tương tác chỉ với một mục danh sách từ danh sách. Và nó không phải là vấn đề của tôi.

Chỉnh sửa: Thực ra tôi đã tìm thấy một giải pháp, giải quyết được vấn đề của tôi, nhưng thay vào đó nó trông giống như thay vì tốt. Tôi bắt đầu hành động StealCount để nhận các vật phẩm đếm từ ListView cuz chúng tôi không thể làm điều đó từ eo biển thử nghiệm (cuz chúng tôi đang ở bên trong Inst thread). Sau đó, tôi bắt đầu kiểm tra dữ liệu cho bất kỳ mục nào từ chế độ xem danh sách bằng cách sử dụng DataInteraction. Có vẻ như sau:

public static void assertAllItems(
    final Matcher<View> adapterViewMatcher, 
    final Matcher<View> itemsMatcher 
) { 
    StealCountAction stealCountAction = new StealCountAction(); 
    onView(adapterViewMatcher).perform(stealCountAction); 

    DataInteraction dataInteraction = onData(anything()) 
     .inAdapterView(adapterViewMatcher); 

    for (int i = 0 ; i < stealCountAction.count; i++) { 
     dataInteraction.atPosition(0) 
      .onChildView(itemsMatcher) 
      .check(ViewAssertions.matches(isDisplayed())); 
    } 
} 

static class StealCountAction implements ViewAction { 

    public int count; 

    @Override 
    public Matcher<View> getConstraints() { 
     return instanceOf(AdapterView.class); 
    } 

    @Override 
    public String getDescription() { 
     return "Steal count action"; 
    } 

    @Override 
    public void perform(UiController uiController, View view) { 
     count = ((AdapterView) view).getCount(); 
    } 
} 

Nhưng dù sao có vẻ xấu xí đối với tôi. Có khả năng nào khác không?

Trả lời

1

Tôi đã làm theo cách khác.

Để kiểm tra một listview bạn chỉ cần làm một cái gì đó như:

for (int i = 0; i < numItems; i++) { 
    onData(anything()) 
      .inAdapterView(withId(R.id.listViewId)).atPosition(i) 
      .check(matches(isDisplayed())); 
} 

Và, trước đây, để có được những biến số Mục bạn cần chỉ để truy cập vào bộ chuyển đổi danh sách của bạn thông qua ActivityTestRule của bạn:

int numItems = ((ListView) mActivityRule.getActivity().findViewById(R.id.listViewId)).getAdapter().getCount(); 

Hoặc, nếu nó bên trong một đoạn:

int numItems = ((ListView) mActivityRule.getActivity().getSupportFragmentManager().findFragmentById(R.id.fragmentId).getView().findViewById(R.id.listViewId)).getAdapter().getCount(); 

Mặc dù tôi hiểu mã của bạn Tôi nghĩ điều này dễ hiểu hơn. Phần khó hiểu duy nhất là cách truy cập vào bộ điều hợp. Nhưng bạn có thể tạo các biến trung gian khác để làm cho nó dễ đọc hơn hoặc tạo một hàm để lấy số này nếu bạn muốn.

+1

Trong trường hợp này tôi giả sử bạn không chờ đợi bất kỳ tài nguyên không tải đang ở trạng thái chạy không tải, chỉ cần nhận các mục đếm từ chủ đề thử nghiệm – busylee

+0

Vâng, tôi không nghĩ về điều này. Vì vậy, bạn có nghĩa là bằng cách nhận được count/numItems từ một ViewAction espresso sẽ chạy các lệnh kiểm tra của bạn vào thời điểm thích hợp và theo cách này nó sẽ không? Đó là một điểm tốt, tôi phải kiểm tra điều này. – jeprubio

+0

Vâng, tôi cho rằng nếu bạn chỉ nhận được Activitity từ quy tắc và nhận được các mục thẳng từ danh sách, nó sẽ được thực hiện không phải bên trong chủ đề chính của ứng dụng của bạn, vì vậy nó có thể dẫn đến một số hành vi sai trái trong các bài kiểm tra. – busylee

Các vấn đề liên quan