2012-04-21 20 views
5

Tôi có một vài thử nghiệm wicket nhắm mục tiêu một DataTable sắp xếp, cụ thể là ajax-nhấp vào các tiêu đề cột có thể sắp xếp và xác nhận nội dung của các hàng nội dung được hiển thị. Bây giờ hệ thống cấp bậc thành phần của con cháu các thành phần của bảng là tự động tạo ra bởi các khuôn khổ wicket, và kết quả là đường dẫn đến các liên kết sắp xếp (ajax) tương tự như:Làm thế nào để giữ cho các đường dẫn thành phần không đổi trong các thử nghiệm đơn vị khi sử dụng Wicket Tester

table:topToolbars:toolbars:0:headers:1:header:orderByLink 

Tuy nhiên, khi các DataTable được tái rendered qua bài kiểm tra, chỉ mục của thành phần thanh công cụ được tăng lên mỗi lần tức là tương tự như:

table:topToolbars:toolbars:1:headers:1:header:orderByLink 

sau đó ngắt các đường dẫn mã hóa cứng của các thử nghiệm thành công khi chúng không khớp nữa.

Đoạn mã cho việc xây dựng DataTable như sau:

 final PayeesProvider dataProvider = new PayeesProvider(); 
    table = new DataTable<ResponsePayeeDetails>("payees", columns, dataProvider, rowsPerPage); 
    table.setOutputMarkupId(true); 
    table.addTopToolbar(new AjaxFallbackHeadersToolbar(table, dataProvider) { 

     private static final long serialVersionUID = -3509487788284410429L; 

     @Override 
     protected WebMarkupContainer newSortableHeader(final String borderId, final String property, final ISortStateLocator locator) { 
      return new AjaxFallbackOrderByBorder(borderId, property, locator, getAjaxCallDecorator()) { 

       @Override 
       protected void onRender() { 
        System.out.printf("Path: %s\n", this.getPageRelativePath()); 
        super.onRender(); 
       } 

       private static final long serialVersionUID = -6399737639959498915L; 

       @Override 
       protected void onAjaxClick(final AjaxRequestTarget target) { 
        target.add(getTable(), navigator, navigatorInfoContainer); 
       } 

       @Override 
       protected void onSortChanged() { 
        super.onSortChanged(); 
        getTable().setCurrentPage(0); 
       } 
      }; 
     } 
    }); 
    table.addBottomToolbar(new NoRecordsToolbar(table)); 
    add(table); 

Để được chính xác, khi tôi chạy thử nghiệm của tôi, System.out.printf trên tuyên bố in:

(1st thử nghiệm)

Path: payees:topToolbars:toolbars:0:headers:1:header 
Path: payees:topToolbars:toolbars:0:headers:2:header 

(thử nghiệm thứ 2)

Path: payees:topToolbars:toolbars:2:headers:1:header 
Path: payees:topToolbars:toolbars:2:headers:2:header 

(thử nghiệm thứ 3)

Path: payees:topToolbars:toolbars:4:headers:1:header 
Path: payees:topToolbars:toolbars:4:headers:2:header 

(thử nghiệm thứ 4)

Path: payees:topToolbars:toolbars:6:headers:1:header 
Path: payees:topToolbars:toolbars:6:headers:2:header 
Path: payees:topToolbars:toolbars:6:headers:1:header 
Path: payees:topToolbars:toolbars:6:headers:2:header 
Path: payees:topToolbars:toolbars:6:headers:1:header 
Path: payees:topToolbars:toolbars:6:headers:2:header 

(5 thử nghiệm)

Path: payees:topToolbars:toolbars:8:headers:1:header 
Path: payees:topToolbars:toolbars:8:headers:2:header 

Có ai biết làm thế nào tôi có thể buộc các thế hệ chỉ số được xác định hơn/lặp lại. Ngoài ra, có cách nào để tạo thẻ hoang dã hoặc nói cách khác là đường dẫn, để làm cho chúng miễn dịch với những gia số này?

Bất kỳ trợ giúp nào sẽ được đánh giá cao về các khoảng trống!

Trả lời

0

Số id đang được tăng lên mỗi lần vì mặc định DataTableItemReuseStrategy, tạo các mục hoàn toàn mới mỗi lần bảng được làm mới. Bạn có thể có một số may mắn thực hiện một tùy chỉnh ItemReuseStrategy nếu giữ id của cùng là một ưu tiên hàng đầu.

Chúng tôi đã gặp phải sự cố tương tự và đã giải quyết một chiến lược phù hợp với câu hỏi thay thế của bạn. Với điều này, bạn có thể yêu cầu kiểm tra để kiểm tra ví dụ: hàng thứ ba trên trang được hiển thị cuối cùng. Lưu ý: Mã nằm trong Scala.

Tóm lại, để giải quyết vấn đề này, chúng tôi đã triển khai phương pháp findNthComponentOnPage để tăng thêm WicketTester.

/** 
    * @param id Wicket id of component to find 
    * @param n 1-based 
    * @tparam T class of component to find 
    * @return the Nth component of class T appearing on the lastRenderedPage 
    */ 
def findNthComponentOnPage[T <: Component : ClassTag](id: String, n: Int): T = { 
    tester.getLastRenderedPage.visitChildren(classTag[T].runtimeClass, new IVisitor[T, T] { 
    var count = 0 

    override def component(checkbox: T, visit: IVisit[T]): Unit = { 
     if (checkbox.getId == id) { 
     count += 1 
     if (count == n) { 
      visit.stop(checkbox) 
     } 

     } 
    } 
    }) 
} 
+0

Cảm ơn lời giải thích rất rõ ràng Patricia. –

0

Xác định đường dẫn có thể khá khó khăn nhưng không cần thiết vì điều này sẽ bao gồm kiểm tra tích hợp chứ không phải kiểm tra đơn vị. Kiểm tra việc sắp xếp cột không nên phụ thuộc vào bảng xung quanh, vì vậy bạn có thể tạo bảng giả trong testcase của bạn thêm tiêu đề và một cột (cột được sắp xếp) cho thử nghiệm. Nếu bạn có đối tượng trên thanh công cụ, bạn có thể sử dụng nó ngay lập tức hoặc lấy lại nó bằng cách phát hành getComponent(toolbar.getPageRelativePath()). Nhưng đảm bảo rằng AjaxFallbackOrderByBorder thực sự hoạt động không phải là mối quan tâm của bạn với tư cách là người dùng của lớp này. Điều này nên được thực hiện bởi tác giả của lớp. Bạn chỉ phải kiểm tra mã của riêng mình (như mã phân loại trong nhà cung cấp dữ liệu của bạn) ...

+0

Cảm ơn Nicktar, tôi không chắc chắn tôi hoàn toàn theo dõi. Những gì tôi đang cố gắng để thực hiện là phần nào giống như một bài kiểm tra tích hợp - sự khác biệt nhỏ là lớp dịch vụ là tất cả mock'ed. Vì vậy, để đảm bảo rằng tất cả các thành phần - Giao diện người dùng và không phải giao diện người dùng - được kết nối chính xác, tôi kích hoạt các cử chỉ qua các tiện ích được hiển thị và xác minh các đoạn trang kết quả. Tôi có thể, như bạn đề nghị, xác minh các mô hình được tạo lại, nhưng điều này có thể loại trừ thử nghiệm rằng các mô hình tương tự được cấu hình và đính kèm chính xác vào giao diện người dùng theo yêu cầu. Hay tôi đã bỏ lỡ quan điểm của bạn? –

+0

@ Michael-7 Quan điểm của tôi là thử nghiệm này không nên là cần thiết, ít nhất là không ở dạng UnitTest. Tôi muốn tách các UnitTests khỏi các bài kiểm tra tích hợp, chạy các trình tạo bởi jUnit, kiểm tra các mô hình ans và chạy sau từ "high above" bằng cách sử dụng selenium ot tương tự, kiểm tra các trang được hiển thị ... – Nicktar

+0

Cảm ơn phản hồi của bạn Nicktar. Lý do tôi sử dụng wicketTester là để tránh phải sử dụng selen mà là tốt nhưng rườm rà - tức là phải khởi động một máy chủ e.t.c. WicketTester là chính xác những gì tôi cần để kiểm tra các thành phần phía máy chủ của tôi, đặc biệt là vòng cuối end-to-end phía máy chủ như tôi làm với phần còn lại của mã của tôi. Tôi phải nhấn mạnh đây không phải là một bài kiểm tra đơn vị, mà là một bài kiểm tra tích hợp với lớp dịch vụ được đưa ra. –