【问题标题】:How to test AjaxFormChoiceComponentUpdatingBehavior in WicketTester如何在 WicketTester 中测试 AjaxFormChoiceComponentUpdatingBehavior
【发布时间】:2011-09-04 19:39:04
【问题描述】:

在我的 Wicket 应用程序中,我使用了一个带有“是”和“否”选项的单选按钮。如果我选择“否”,我应该显示一个下拉选项。我使用AjaxFormChoiceComponentUpdatingBehavior 编写代码。如何使用 WicketTester 对其进行单元测试?

【问题讨论】:

    标签: java wicket wicket-tester


    【解决方案1】:

    Wicket 1.5.x 的解决方案:

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

    【讨论】:

    • 在 Wicket 6 中成功尝试过此操作
    【解决方案2】:

    首先选择你想要的单选按钮。

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

    然后执行ajax行为:

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

    【讨论】:

      【解决方案3】:

      这是我的一段代码,它非常适合我的选择框,但如果你更改 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);
      

      我错过了如何在以前的答案中更新表单值。

      【讨论】:

        【解决方案4】:

        如果单选按钮在表单上,​​我认为您应该使用 FormTester 类:

        http://wicket.apache.org/apidocs/1.4/org/apache/wicket/util/tester/FormTester.html

        有关 Ajax 表单提交测试的示例,您可以查看:

        http://www.java2s.com/Open-Source/Java-Document/J2EE/wicket-1.4/org/apache/wicket/ajax/form/AjaxFormSubmitTest.java.htm

        【讨论】:

          【解决方案5】:

          试试这样的: tester.executeAjaxEvent("form:myRadioButtonId", "onchange");

          【讨论】:

          • 很好的直觉,但不幸的是这不起作用,因为 AjaxFormChoiceComponentUpdatingBehavior 不是 AjaxEventBehavior。
          【解决方案6】:

          事实证明这有点痛苦,至少在 Wicket 1.4 中(我没有尝试过 1.5)。

          通过网络搜索,我在Mischa Dasberg's blog 中找到了提示。基本上,您不能使用BaseWicketTester.executeAjaxEvent((String componentPath, String event) 方法,因为您使用的行为不是AjaxEventBehavior,而且您不能使用BaseWicketTester.executeBehavior(final AbstractAjaxBehavior behavior),因为它会清除请求参数。

          Mischa 的解决方案是在父测试用例中实现他自己的 executeBehavior 方法,该方法适用于他的情况,但不适用于我的需要,因为它假定请求参数 id 与完整组件路径相同。

          我通过在WicketTester 的扩展中实现我自己的executeAjaxBehavior 做了类似的事情,但假设(在我的情况下是这样)请求参数是组件路径的最后一个“:”分隔部分:

          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 类中用于其他行为测试方法的代码类似的代码,可能值得一看。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-25
            • 1970-01-01
            • 2011-04-30
            • 1970-01-01
            • 2016-09-14
            相关资源
            最近更新 更多