단위 테스트 MODALWINDOW의 컨텐츠 새로 고침이 실패하면 실제 기능이 예상대로 작동합니다. 내가 무엇을 잘못하고 있습니까?

StackOverflow https://stackoverflow.com/questions/1802975

  •  05-07-2019
  •  | 
  •  

문제

그래서, 나는 먼저 이것을 "고정"하려고 한 다음 미친 사람처럼 인터넷 검색을 시도했지만 지금 도와 줄 도에는 아무것도 찾지 못했습니다.

기본적으로 나는 관습이 있습니다 Panel 개찰구 내에서 ModalWindow 그리고 단위 테스트를 좋아하기 때문에 테스트하고 싶습니다. 여기의 구체적인 행동은 상쾌합니다 ModalWindow의 내용 : AJAX 이벤트 처리가 실제로 새로운 내용을 컨텐츠 패널에 다시로드 한 실제 코드 에서이 내용을 더 짧게 만들도록 제거했습니다.

그래서 여기에 있습니다 Panel코드

package wicket.components;

import org.apache.wicket.ajax.AjaxRequestTarget;

import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.*;

public class MyModalWindowPanel extends Panel {

    private Form form;
    private ModalWindow modal;

    public MyModalWindowPanel(String id, ModalWindow modal) {
        super(id);

        this.setOutputMarkupId(true);
        this.modal = modal;

        initializeForm();    
        addBasicDataFieldsToForm();    
        add(campaignForm);
    }

    private void initializeForm() {
        form = new Form("form");
        form.setOutputMarkupId(true);
    }

    private void addBasicDataFieldsToForm() {
        campaignForm.add(new AjaxButton("infoSubmit",
                         new Model<String>("Ajaxy Click")) {

            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {

                modal.setContent(new MyModalWindowPanel(modal.getContentId(),
                                                        modal));

                modal.show(target);
            }
        });
    }
}

그리고 해당 마크 업

<wicket:panel>
    <form wicket:id="form">
        <input type="submit" value="Ajaxy Click" wicket:id="infoSubmit" />
    </form>
</wicket:panel>

Tomcat과 같은 서블릿 컨테이너에서 실행되면 올바르게 작동합니다. 여기에는 기능적인 버그가 없습니다!

그렇다면 문제는 무엇입니까? 나는 겉보기에 얻을 수 없다 단위 테스트 이것이 작동하기 위해! 패널 테스트 클래스는 다음과 같습니다

package wicket.components;

import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.util.tester.*;
import junit.framework.TestCase;

public class MyModalWindowPanelTestCase extends TestCase {

    private WicketTester tester;    
    private ModalWindow modal;

    @Override
    protected void setUp() throws Exception {
        tester = new WicketTester();    
        modal = new ModalWindow("modal");

        tester.startPanel(new TestPanelSource() {

            public Panel getTestPanel(String id) {    
                return new MyModalWindowPanel(id, modal);
            }
        });
    }

    public void testReloadingPanelWorks() throws Exception {
        // the next line fails!
        tester.executeAjaxEvent("panel:campaignForm:campaignInfoSubmit",
                                "onclick");
        tester.assertNoErrorMessage();
    }
}

그리고 다음은 그 실행의 스택 트레이스가 있습니다

java.lang.IllegalStateException: No Page found for component [MarkupContainer [Component id = modal]]
    at org.apache.wicket.Component.getPage(Component.java:1763)
    at org.apache.wicket.RequestCycle.urlFor(RequestCycle.java:872)
    at org.apache.wicket.Component.urlFor(Component.java:3295)
    at org.apache.wicket.behavior.AbstractAjaxBehavior.getCallbackUrl(AbstractAjaxBehavior.java:124)
    at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.getCallbackScript(AbstractDefaultAjaxBehavior.java:118)
    at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.getCallbackScript(AbstractDefaultAjaxBehavior.java:106)
    at org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow$WindowClosedBehavior.getCallbackScript(ModalWindow.java:927)
    at org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.getWindowOpenJavascript(ModalWindow.java:1087)
    at org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.show(ModalWindow.java:352)
    at wicket.components.MyModalWindowPanel$1.onSubmit(MyModalWindowPanel.java:45)
    at org.apache.wicket.ajax.markup.html.form.AjaxButton$1.onSubmit(AjaxButton.java:102)
    at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior.onEvent(AjaxFormSubmitBehavior.java:143)
    at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:177)
    at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:299)
    at org.apache.wicket.util.tester.BaseWicketTester.executeAjaxEvent(BaseWicketTester.java:1236)
    at org.apache.wicket.util.tester.BaseWicketTester.executeAjaxEvent(BaseWicketTester.java:1109)
    at wicket.components.MyModalWindowPanelTestCase.testReloadingPanelWorks(MyModalWindowPanelPanelTestCase.java:31)
    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 junit.framework.TestCase.runTest(TestCase.java:168)
    at junit.framework.TestCase.runBare(TestCase.java:134)
    at junit.framework.TestResult$1.protect(TestResult.java:110)
    at junit.framework.TestResult.runProtected(TestResult.java:128)
    at junit.framework.TestResult.run(TestResult.java:113)
    at junit.framework.TestCase.run(TestCase.java:124)
    at junit.framework.TestSuite.runTest(TestSuite.java:232)
    at junit.framework.TestSuite.run(TestSuite.java:227)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:81)
    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)

그래서, 통과되도록 단위 테스트를 어떻게 수정해야합니까?

도움이 되었습니까?

해결책

나는 여기서 사지로 나가서 말할 것입니다 : 테스트를 위해 패널 구성 요소를 페이지에 추가합니다 ..

Afaik 개별 구성 요소를 테스트 할 수는 없지만 페이지를 가져 와서 테스트를 설정해야합니다.

이것이 제가 테스트에 사용하는 것입니다.

public class TestHomePage {
    private static WicketTester tester;

    @BeforeClass
    public static void setUp() {
        tester = new WicketTester(new WicketApplication() {
            @Override
            protected void init() {
                //Override init to use SpringUtil's SpringContext due to missing WebApplicationContext
                addComponentInstantiationListener(new SpringComponentInjector(this, SpringUtil.getContext()));
            }
        });
    }

    @Test
    public void testRenderMyPage() {
        //start and render the test page
        tester.startPage(HomePage.class);

        //assert rendered page class
        tester.assertRenderedPage(HomePage.class);

        //assert page contents
        tester.assertContains("Welcome to my webpage");
    }
}

내가 틀렸다면 나를 바로 잡아주세요!

다른 팁

"생산"코드는 표면적으로 작동하는 것으로 나타났습니다. 변수 캠페인 형식이 필드 형식이어야한다고 생각합니다.

그러나 근본 문제는 모달 창 자체가 실제로 구성 요소에 첨부되어 있지 않으므로 렌더링 할 수 없다는 것입니다.

실제 코드에 MyModalWindowPanel 구성 요소 외부에 첨부되어 있으면 테스트를 작성하여 테스트 페이지 또는 모달 창과 모두 포함 된 테스트 패널을 만들 수 있습니다. 테스트중인 구성 요소.

내가 "Page Found"예외를 얻은 유일한 시간은 패널 생성자에서 getPage ()를 호출하려고 할 때였습니다. 패널이 페이지에 추가되기 전에 생성자가 실행되므로 아무것도 찾을 수 없습니다 ... 아마도 그런 일을하고 있습니까? 아마도이 코드는 생산에서 작동하지만 여전히 무대 뒤에서 그 오류를 던지고 있습니까?

나는 그것이 당신이 찾고있는 것이 아니라는 것을 알고 있지만 나는 찾았습니다. 셀렌 웹 UI를 테스트하기위한 훌륭한 도구가됩니다. Junit은 로직을 테스트하는 데 굉장하지만 Selenium은 UI에 올바른 것을 표시하는 데 더 적합합니다. 그것은 GUI 인터페이스와 그와 같은 것처럼 보이지만 훌륭하게 작동하며 약간 파헤 치면 스크립팅 API에 쉽게 액세스 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top