atualização de conteúdo da unidade de teste ModalWindow falhar enquanto a funcionalidade real funciona como esperado - o que estou fazendo de errado?

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Então, eu passei um par de horas antes tentar "consertar" isso mesmo e, em seguida, pesquisando como um louco, mas não encontrou nada que pudesse ter ajudado então agora eu estou aqui.

Basicamente, eu tenho um Panel personalizado dentro do próprio ModalWindow do Wicket e desde que eu como testes de unidade, eu quero testá-lo. O comportamento específico aqui é refrescante conteúdo do ModalWindow:. No meu código real de onde eu extraído este evento Ajax manipulação realmente recarrega novidades para o painel de conteúdo, eu só removeu os para fazer este mais curto

Então, aqui está o código do 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);
            }
        });
    }
}

e a marcação correspondente

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

Note que quando executado no servlet container como o Tomcat, isso funciona corretamente - não há nenhum erros funcionais aqui

Então, qual é o problema, então? Eu não sou aparentemente capaz de obter o teste de unidade para que isso funcione! Minha classe de teste para os olhares do painel como este

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();
    }
}

e aqui está o stacktrace resultantes da execução desse

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)

Assim, como pode / I deve corrigir o meu teste de unidade para que ele iria passar?

Foi útil?

Solução

Eu vou sair em um membro aqui e dizer: Adicionar uma componente Painel para uma página para testar ..

AFAIK você não pode testar os componentes individuais, mas deve configurar um teste, obtendo uma página e fazendo afirma sobre isso ..

Isto é o que eu uso para testar:

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");
    }
}

Por favor, me corrija se eu estiver errado!

Outras dicas

O código de "produção" mostraram que aparentemente funciona é inconsistente. Eu suspeito que a campaignForm variável é suposto ser o campo de formulário.

Mas eu acho que a raiz do problema é que a própria janela modal em nenhum lugar é realmente ligado a um componente, e, portanto, não pode ser processado.

Se no código real, é anexado em algum lugar fora da sua componente MyModalWindowPanel, você definitivamente precisa para anexá-lo em algum lugar do teste, bem como, provavelmente, tornando o seu build de teste ou uma página de teste ou um painel de teste que contém tanto o janela modal eo componente sob teste.

A única vez que eu comecei que "Não Page encontrado" exceção foi quando tentando chamar getPage () em um construtor painel. O construtor é executado antes que o painel é adicionado a uma página, para que nada seja encontrado ... Você talvez fazer algo assim? Talvez esse código funciona em produção, mas ainda está jogando esse erro nos bastidores?

Eu sei que não é o que você está procurando, mas eu encontrei selênio para ser uma grande ferramenta para testando UI da web. JUnit é incrível para testar a lógica, mas selênio é mais adequado para ter certeza que a coisa direito exibe em sua UI. Parece hinky com a sua interface gráfica e tal, mas ele funciona muito bem, e se você cavar um pouco a api scripting é facilmente acessível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top