2011-05-30 20 views
7

Trong ứng dụng Wicket của tôi, tôi đã sử dụng một nút radio có tùy chọn "có" và "không". Nếu tôi chọn "Không", tôi sẽ hiển thị một lựa chọn thả xuống. Tôi đã viết mã bằng cách sử dụng AjaxFormChoiceComponentUpdatingBehavior. Làm thế nào để loại bỏ điều này bằng cách sử dụng WicketTester?Cách kiểm tra AjaxFormChoiceComponentUpdatingBehavior trong WicketTester

Trả lời

0

Hãy thử một cái gì đó như thế này: tester.executeAjaxEvent("form:myRadioButtonId", "onchange");

+1

Bản năng tốt, nhưng điều này không may sẽ không hoạt động như AjaxFormChoiceComponentUpdatingBehavior không phải là AjaxEventBehavior. –

0

Điều này hóa ra hơi đau, ít nhất là trong Wicket 1.4 (Tôi chưa thử với 1.5).

Thông qua tìm kiếm trên web, tôi đã tìm thấy gợi ý trong Mischa Dasberg's blog. Về cơ bản, bạn không thể sử dụng phương thức BaseWicketTester.executeAjaxEvent((String componentPath, String event) vì hành vi bạn đang sử dụng không phải là và bạn không thể sử dụng BaseWicketTester.executeBehavior(final AbstractAjaxBehavior behavior) vì nó xóa các tham số yêu cầu.

Giải pháp của Mischa là triển khai phương pháp executeBehavior của riêng mình trong trường hợp thử nghiệm cha mẹ, hoạt động cho tình huống của mình, nhưng không phải cho nhu cầu của tôi, vì nó giả định id thông số yêu cầu giống với đường dẫn thành phần đầy đủ.

tôi đã thực hiện một cái gì đó tương tự bằng cách thực hiện riêng executeAjaxBehavior của tôi trong một phần mở rộng của WicketTester, nhưng giả định (như là đúng trong trường hợp của tôi) rằng tham số yêu cầu là người cuối cùng ":":

phần của con đường thành phần tách
public void executeAjaxBehavior(String path, String value) { 
    AbstractAjaxBehavior behavior = (AbstractAjaxBehavior) getComponentFromLastRenderedPage(path).getBehaviors().get(0); 
    CharSequence url = behavior.getCallbackUrl(false); 
    WebRequestCycle cycle = setupRequestAndResponse(true); 
    getServletRequest().setRequestToRedirectString(url.toString()); 
    String[] ids = path.split(":"); 
    String id = ids[ids.length-1]; 
    getServletRequest().setParameter(id, value); 
    processRequestCycle(cycle); 
} 

Cả giải pháp và mỏ của ông (dựa trên ông) cũng cho rằng hành vi này là hành vi đầu tiên (hoặc duy nhất) trên thành phần.

Đây là một chút lộn xộn, nhưng một cái gì đó như thế này có thể làm việc cho bạn. Có thể tốt hơn nếu id và hành vi được nhận riêng và được chuyển thành tham số, và tất nhiên bạn có thể làm tốt để tìm ra hành vi đầu tiên thực sự là AjaxFormChoiceComponentUpdatingBehavior thay vì cho rằng đó là hành vi đầu tiên, nhưng điều này là một sự khởi đầu.

Đây cũng là mã tương tự với những gì bên trong lớp BaseWicketTester cho các phương pháp thử nghiệm hành vi khác, có thể đáng xem xét.

4

Giải pháp cho Wicket 1.5.x:

AbstractAjaxBehavior behavior = (AbstractAjaxBehavior)WicketTesterHelper. 
      findBehavior(getTester().getComponentFromLastRenderedPage("path:to:component"), 
         AjaxFormChoiceComponentUpdatingBehavior.class); 
getTester().executeBehavior(behavior); 
+0

Đã thử điều này với thành công trong Wicket 6 – Sonata

2

Trước tiên hãy chọn nút radio mà bạn muốn.

form.select("path to radio button", 0/1) 

Sau đó thực hiện hành vi ajax:

tester.executeBehavior((AbstractAjaxBehavior)tester.getComponentFromLastRenderedPage("path to radio buttons").getBehaviors().get(0)); 
1

Đây là mảnh của tôi về mã mà hoạt động hoàn hảo cho tôi với hộp chọn nhưng nên fiat cũng cho nút radio nếu bạn thay đổi lớp Behaviour.bước cần thiết là:

  • Chèn giá trị mới vào mẫu (sử dụng FormTester)
  • Find hành vi
  • Execute hành vi về biến đổi

Dưới đây là một ví dụ về mã:

//simulate insert new value 
FormTester formTester = tester.newFormTester(PANEL_ID + FORM); 
formTester.setValue("selectBox", "newValue"); 
//Find onchange behaviour 
AjaxFormComponentUpdatingBehavior behavior = 
     (AjaxFormComponentUpdatingBehavior) WicketTesterHelper.findBehavior(
     tester.getComponentFromLastRenderedPage(PANEL_ID + FORM + ":" + "selectBox"), 
     ajaxFormComponentUpdatingBehavior.class); 
//execute onchange 
tester.executeBehavior(behavior); 

Tôi đã bỏ lỡ cách cập nhật giá trị biểu mẫu trong các câu trả lời trước.