2015-11-12 19 views
6

Tôi có một thử nghiệm cho một cái nhìn bộ sưu tập mà làm việc như thế này:tế bào Wrong đếm để xem bộ sưu tập trong giao diện người dùng thử nghiệm

func testDeleteItem() { 
    app.collectionViews.staticTexts["Item"].tap() 
    app.buttons["Delete"].tap() 

    XCTAssertEqual(app.collectionViews.cells.count, 2) 
    XCTAssertFalse(app.collectionViews.cells.staticTexts["Item"].exists) 
} 

Sau vòi nước, có một màn hình mới với nút delete. Khi nút được nhấn, màn hình sẽ tự tắt và tải lại chế độ xem bộ sưu tập. Mọi thứ diễn ra như mong đợi trong giao diện người dùng, nhưng tôi nhận được cả hai xác nhận không thành công. Trong số đầu tiên nó vẫn là 3 và trong mục thứ hai nó vẫn tồn tại.

Chỉnh sửa: Tôi đã tạo điều này simple example on GitHub để trình bày lỗi.

+0

tôi thấy thử nghiệm trong mô phỏng khi nó đi và nó sẽ là ok. Ảnh chụp màn hình cũng hiển thị 2 mục còn lại.Tôi nghĩ rằng nó có thể thất bại vì nó không chờ đợi để hoàn thành việc loại bỏ màn hình, nhưng 'expectationForPredicate' với' waitForExpectationsWithTimeout' cũng không thành công. –

+0

Nhật ký không hiển thị bất kỳ thứ gì không đúng thứ tự. –

+0

Thử nghiệm này cũng không thành công, khi ô bị xóa trực tiếp trên 'collectionView: didSelectCell:', việc đặt các xác nhận trong 'dispatch_async' cũ tốt sẽ làm cho các kiểm tra vượt qua. Nó không có vẻ là một giải pháp thích hợp, nhưng chỉ ra trên luồng là tốt. Thú vị –

Trả lời

10

Tôi đã tìm thấy giải pháp, nhưng đó là giải pháp cho hành vi API sai. Chế độ xem bộ sưu tập là các ô lưu trong bộ nhớ cache, đó có thể là lý do tại sao tôi có 3 ô, ngay cả khi tôi đã xóa một ô. tế bào xóa là offscreen, vì vậy bạn có thể kiểm tra nếu nó là hittable: mở rộng

XCTAssertFalse(app.cells.staticTexts["Item"].hittable) 

Để tìm một số, tôi đã tạo:

extension XCUIElementQuery { 
    var countForHittables: UInt { 
     return UInt(allElementsBoundByIndex.filter { $0.hittable }.count) 
    } 
} 

và thử nghiệm của tôi trông như thế này:

func testDeleteItem() { 
    app.collectionViews.staticTexts["Item"].tap() 
    app.buttons["Delete"].tap() 

    XCTAssertEqual(app.collectionViews.cells.countForHittables, 2) 
    XCTAssertFalse(app.collectionViews.cells.staticTexts["Item"].hittable) 
} 
+0

Chỉ có vấn đề này. Sự cần thiết cho một workaround là không may, nhưng workaround hoạt động, đó là tuyệt vời. Cảm ơn! – greymouser

1

Tôi cũng đã gặp vấn đề này, nhưng trong trường hợp của tôi, truy vấn .cells không được đánh giá đúng. Thay vì .cells, sử dụng

XCUIApplication().collectionViews.element.childrenMatchingType(.Cell).count 

làm việc cho tôi và trả lại số chính xác.


Cập nhật:

Tôi cũng thấy rằng di chuyển khung nhìn sao cho tất cả các tế bào được dequeued trước khi số lượng cố định vấn đề này. Dường như khuôn khổ trợ năng không tìm thấy các tế bào khác cho đến khi chúng bị loại bỏ (tôi đoán là có ý nghĩa).

XCUIApplication().collectionViews.element.swipeUp()

0

Tôi chạy vào câu hỏi này khi tôi đang tìm kiếm câu trả lời tương tự, nhưng trong Objective-C. Đối với những người như tôi, tôi thích nghi @ phương pháp Tomasz để đếm Collection Xem các tế bào trong các thử nghiệm giao diện người dùng:

-(NSInteger)countForHittables:(NSArray<XCUIElement*>*)collectionView{ 
    __block int hittables = 0; 
    [collectionView enumerateObjectsUsingBlock:^(XCUIElement * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 
     if (obj.hittable){ 
      hittables++; 
     } 
    }]; 
    return hittables; 
} 

Để gọi nó là: [self countForHittables:app.collectionViews.cells.allElementsBoundByIndex];.

0

Tôi gặp vấn đề tương tự. Ngay cả khi bộ sưu tập không được điền bởi vì nó đang chờ phản hồi của API, cells.count> = 1 luôn đúng.

Những gì tôi đã làm, dựa trên Tomasz Bąk's answer Tôi tạo ra một phần mở rộng để chờ đợi cho bộ sưu tập trở nên thông dụng:

extension XCTestCase { 
    func waitForCollectionToBePopulated(_ element: XCUIElement, timeout: TimeInterval) { 
     let query = element.cells 
     let p = NSPredicate(format: "countForHittables >= 1") 
     let e = expectation(for: p, evaluatedWith: query, handler: nil) 
     wait(for: [e], timeout: timeout) 
    } 
} 

Và trên trang web gọi sẽ xem xét:

waitForCollectionToBePopulated(collection, timeout: {timeOut}) 
Các vấn đề liên quan