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
Nếu nút radio là một hình thức tôi nghĩ rằng bạn nên sử dụng lớp FormTester:
http://wicket.apache.org/apidocs/1.4/org/apache/wicket/util/tester/FormTester.html
Đối với một ví dụ về hình thức Ajax nộp bài kiểm tra, bạn có thể có một cái nhìn tại địa chỉ:
Hãy thử một cái gì đó như thế này: tester.executeAjaxEvent("form:myRadioButtonId", "onchange");
Đ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 ":":
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.
Giải pháp cho Wicket 1.5.x:
AbstractAjaxBehavior behavior = (AbstractAjaxBehavior)WicketTesterHelper.
findBehavior(getTester().getComponentFromLastRenderedPage("path:to:component"),
AjaxFormChoiceComponentUpdatingBehavior.class);
getTester().executeBehavior(behavior);
Đã thử điều này với thành công trong Wicket 6 – Sonata
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));
Đâ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.
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. –