在我的 Wicket 应用程序中,我使用了一个带有“是”和“否”选项的单选按钮。如果我选择“否”,我应该显示一个下拉选项。我使用AjaxFormChoiceComponentUpdatingBehavior
. 如何使用 WicketTester 对此进行单元测试?
6 回答
Wicket 1.5.x 的解决方案:
AbstractAjaxBehavior behavior = (AbstractAjaxBehavior)WicketTesterHelper.
findBehavior(getTester().getComponentFromLastRenderedPage("path:to:component"),
AjaxFormChoiceComponentUpdatingBehavior.class);
getTester().executeBehavior(behavior);
首先选择所需的单选按钮。
form.select("path to radio button", 0/1)
然后执行ajax行为:
tester.executeBehavior((AbstractAjaxBehavior)tester.getComponentFromLastRenderedPage("path to radio buttons").getBehaviors().get(0));
这是我的一段代码,它对我来说非常适合选择框,但如果你更改 Behavior 类,它也应该适用于单选按钮。需要的步骤是:
- 将新值插入表单(使用 FormTester)
- 查找行为
- 执行变更行为
这是一个代码示例:
//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);
我错过了如何更新先前答案中的表单值的标准。
尝试这样的事情:
tester.executeAjaxEvent("form:myRadioButtonId", "onchange");
如果单选按钮在表单上,我认为您应该使用 FormTester 类:
http://wicket.apache.org/apidocs/1.4/org/apache/wicket/util/tester/FormTester.html
对于 Ajax 表单提交测试的示例,您可以查看:
事实证明这有点痛苦,至少在 Wicket 1.4 中(我没有尝试过 1.5)。
通过网络搜索,我在Mischa Dasberg 的博客中找到了提示。基本上,您不能使用该BaseWicketTester.executeAjaxEvent((String componentPath, String event)
方法,因为您使用的行为不是,AjaxEventBehavior
并且您不能使用该方法,BaseWicketTester.executeBehavior(final AbstractAjaxBehavior behavior)
因为它会清除请求参数。
executeBehavior
Mischa 的解决方案是在父测试用例中实现他自己的方法,这适用于他的情况,但不适用于我的需要,因为它假定请求参数 id 与完整组件路径相同。
我已经通过executeAjaxBehavior
在WicketTester
.
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);
}
他的解决方案和我的解决方案(基于他的)都假设行为是组件上的第一个(或唯一一个)行为。
这有点笨拙,但这样的事情可能对你有用。
如果将 id 和行为分开获取并作为参数传递可能会更好,当然,您最好找到实际上是的第一个行为,AjaxFormChoiceComponentUpdatingBehavior
而不是愉快地假设它是第一个行为,但这是一个开始。
这也与BaseWicketTester
其他行为测试方法的类中的代码类似,可能值得一看。