You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Todd Nine <to...@spidertracks.co.nz> on 2010/06/11 06:54:05 UTC

Errors with rendering feedback labels on a form during unit testing. Works fine when viewed from the browser.

Hi all,
  I'm getting some strange behavior from my tests.  I have an abstract
class that all ajax feedback forms inherit from.  BaseFeedBackForm 

http://pastebin.com/NWALFWvi


I have this test code



http://pastebin.com/zZyzG1e6

What's happening is my onBeforeRender of my BaseFeedbackForm is being
invoked twice.  The first time it is invoked is by this line of code in
my test.

tester.startPage(HomePage.class);

This visits all the form components, and decorates all components except
buttons with a FormFeedBacklabel.  A label I'm using to display
validation errors when the input is incorrect onblur.  This works well
when the form is created both in my unit test and when rendered via a
browser.  However, when this is invoked.

registerForm.submit();

My page is re-rendered, which is throwing the error 

org.apache.wicket.WicketRuntimeException: Error attaching this container
for rendering: [MarkupContainer [Component id = registrationPanel]]
	at
org.apache.wicket.MarkupContainer.onBeforeRenderChildren(MarkupContainer.java:1739)
	at org.apache.wicket.Component.onBeforeRender(Component.java:3855)
	at
org.apache.wicket.Component.internalBeforeRender(Component.java:1061)
	at org.apache.wicket.Component.beforeRender(Component.java:1095)
	at
org.apache.wicket.MarkupContainer.onBeforeRenderChildren(MarkupContainer.java:1727)
	at org.apache.wicket.Component.onBeforeRender(Component.java:3855)
	at org.apache.wicket.Page.onBeforeRender(Page.java:1521)
	at
org.apache.wicket.Component.internalBeforeRender(Component.java:1061)
	at org.apache.wicket.Component.beforeRender(Component.java:1095)
	at org.apache.wicket.Component.prepareForRender(Component.java:2225)
	at org.apache.wicket.Component.prepareForRender(Component.java:2262)
	at org.apache.wicket.Page.renderPage(Page.java:893)
	at
org.apache.wicket.request.target.component.PageRequestTarget.respond(PageRequestTarget.java:63)
	at
org.apache.wicket.request.AbstractRequestCycleProcessor.respond(AbstractRequestCycleProcessor.java:105)
	at
org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1258)
	at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)
	at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428)
	at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
	at
org.apache.wicket.protocol.http.MockWebApplication.processRequestCycle(MockWebApplication.java:524)
	at org.apache.wicket.util.tester.FormTester.submit(FormTester.java:667)
	at
com.spidertracks.aviator.logbook.HomePageTest.testSignupValid(HomePageTest.java:47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.junit.runners.model.FrameworkMethod
$1.runReflectiveCall(FrameworkMethod.java:44)
	at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
	at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
	at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
	at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.IllegalArgumentException: A child with id
'email_feedback' already exists:
[MarkupContainer [Component id = registrationForm]]
	at org.apache.wicket.MarkupContainer.add(MarkupContainer.java:145)
	at com.spidertracks.aviator.logbook.html.BaseFeedbackForm
$FeedBackVisitor.formComponent(BaseFeedbackForm.java:76)
	at org.apache.wicket.markup.html.form.Form$9.component(Form.java:1192)
	at
org.apache.wicket.MarkupContainer.visitChildren(MarkupContainer.java:878)
	at
org.apache.wicket.markup.html.form.Form.visitFormComponents(Form.java:1188)
	at
com.spidertracks.aviator.logbook.html.BaseFeedbackForm.onBeforeRender(BaseFeedbackForm.java:52)
	at
org.apache.wicket.Component.internalBeforeRender(Component.java:1061)
	at org.apache.wicket.Component.beforeRender(Component.java:1095)
	at
org.apache.wicket.MarkupContainer.onBeforeRenderChildren(MarkupContainer.java:1727)
	... 43 more



Should I not be using onBeforeRender in this way, and instead using a
listener for when the components are added to the form?  I'm new to
wicket, so any help would be greatly appreciated.

thanks,
Todd





Re: Errors with rendering feedback labels on a form during unit testing. Works fine when viewed from the browser.

Posted by Igor Vaynberg <ig...@gmail.com>.
onbeforerender is called before every render, so the second render
that is invoked after onsubmit() is running onbeforerender() again and
adding duplicate components. your visitor should check if the
component it is trying to add already exists using component#get(id)

-igor

On Thu, Jun 10, 2010 at 9:54 PM, Todd Nine <to...@spidertracks.co.nz> wrote:
> Hi all,
>  I'm getting some strange behavior from my tests.  I have an abstract
> class that all ajax feedback forms inherit from.  BaseFeedBackForm
>
> http://pastebin.com/NWALFWvi
>
>
> I have this test code
>
>
>
> http://pastebin.com/zZyzG1e6
>
> What's happening is my onBeforeRender of my BaseFeedbackForm is being
> invoked twice.  The first time it is invoked is by this line of code in
> my test.
>
> tester.startPage(HomePage.class);
>
> This visits all the form components, and decorates all components except
> buttons with a FormFeedBacklabel.  A label I'm using to display
> validation errors when the input is incorrect onblur.  This works well
> when the form is created both in my unit test and when rendered via a
> browser.  However, when this is invoked.
>
> registerForm.submit();
>
> My page is re-rendered, which is throwing the error
>
> org.apache.wicket.WicketRuntimeException: Error attaching this container
> for rendering: [MarkupContainer [Component id = registrationPanel]]
>        at
> org.apache.wicket.MarkupContainer.onBeforeRenderChildren(MarkupContainer.java:1739)
>        at org.apache.wicket.Component.onBeforeRender(Component.java:3855)
>        at
> org.apache.wicket.Component.internalBeforeRender(Component.java:1061)
>        at org.apache.wicket.Component.beforeRender(Component.java:1095)
>        at
> org.apache.wicket.MarkupContainer.onBeforeRenderChildren(MarkupContainer.java:1727)
>        at org.apache.wicket.Component.onBeforeRender(Component.java:3855)
>        at org.apache.wicket.Page.onBeforeRender(Page.java:1521)
>        at
> org.apache.wicket.Component.internalBeforeRender(Component.java:1061)
>        at org.apache.wicket.Component.beforeRender(Component.java:1095)
>        at org.apache.wicket.Component.prepareForRender(Component.java:2225)
>        at org.apache.wicket.Component.prepareForRender(Component.java:2262)
>        at org.apache.wicket.Page.renderPage(Page.java:893)
>        at
> org.apache.wicket.request.target.component.PageRequestTarget.respond(PageRequestTarget.java:63)
>        at
> org.apache.wicket.request.AbstractRequestCycleProcessor.respond(AbstractRequestCycleProcessor.java:105)
>        at
> org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1258)
>        at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)
>        at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428)
>        at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
>        at
> org.apache.wicket.protocol.http.MockWebApplication.processRequestCycle(MockWebApplication.java:524)
>        at org.apache.wicket.util.tester.FormTester.submit(FormTester.java:667)
>        at
> com.spidertracks.aviator.logbook.HomePageTest.testSignupValid(HomePageTest.java:47)
>        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>        at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>        at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>        at java.lang.reflect.Method.invoke(Method.java:597)
>        at org.junit.runners.model.FrameworkMethod
> $1.runReflectiveCall(FrameworkMethod.java:44)
>        at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>        at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
>        at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>        at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
>        at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
>        at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
>        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
>        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
>        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
>        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
>        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
>        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
>        at
> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
>        at
> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>        at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>        at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>        at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>        at
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> Caused by: java.lang.IllegalArgumentException: A child with id
> 'email_feedback' already exists:
> [MarkupContainer [Component id = registrationForm]]
>        at org.apache.wicket.MarkupContainer.add(MarkupContainer.java:145)
>        at com.spidertracks.aviator.logbook.html.BaseFeedbackForm
> $FeedBackVisitor.formComponent(BaseFeedbackForm.java:76)
>        at org.apache.wicket.markup.html.form.Form$9.component(Form.java:1192)
>        at
> org.apache.wicket.MarkupContainer.visitChildren(MarkupContainer.java:878)
>        at
> org.apache.wicket.markup.html.form.Form.visitFormComponents(Form.java:1188)
>        at
> com.spidertracks.aviator.logbook.html.BaseFeedbackForm.onBeforeRender(BaseFeedbackForm.java:52)
>        at
> org.apache.wicket.Component.internalBeforeRender(Component.java:1061)
>        at org.apache.wicket.Component.beforeRender(Component.java:1095)
>        at
> org.apache.wicket.MarkupContainer.onBeforeRenderChildren(MarkupContainer.java:1727)
>        ... 43 more
>
>
>
> Should I not be using onBeforeRender in this way, and instead using a
> listener for when the components are added to the form?  I'm new to
> wicket, so any help would be greatly appreciated.
>
> thanks,
> Todd
>
>
>
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org