Test des unités L'actualisation du contenu de ModalWindow échoue alors que la fonctionnalité réelle fonctionne comme prévu. Qu'est-ce qui ne va pas?

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

  •  05-07-2019
  •  | 
  •  

Question

J'ai donc passé quelques heures à essayer de "réparer" moi-même puis googler comme un fou, mais je n'ai rien trouvé qui aurait pu m'aider, alors maintenant je suis là.

J'ai un panneau personnalisé dans le ModalWindow de Wicket et, depuis que j'aime les tests unitaires, je veux le tester. Le comportement spécifique ici actualise le contenu de ModalWindow : Dans le code actuel d'où j'ai extrait ceci, la gestion des événements Ajax recharge en réalité de nouveaux éléments dans le panneau de contenu. J'ai simplement supprimé ceux-ci pour les raccourcir.

Alors, voici le code du panneau

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

et le balisage correspondant

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

Notez que lorsqu’il est exécuté dans un conteneur de servlets tel que Tomcat, cela fonctionne correctement - il n’ya pas de bugs fonctionnels ici!

Alors, quel est le problème alors? Je ne suis apparemment pas en mesure de passer le test unitaire pour que cela fonctionne! Ma classe de test pour le panneau ressemble à ceci

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

et voici le stacktrace résultant de l'exécution de ce

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)

Alors, comment puis-je / dois-je réparer mon test unitaire pour qu'il passe?

Était-ce utile?

La solution

Je vais y aller un peu ici et dire: Ajoutez votre composant Panel à une page pour le tester ..

Autant que je sache, vous ne pouvez pas tester des composants individuels, mais vous devez configurer un test en obtenant une page et en faisant des affirmations à ce sujet.

Voici ce que j'utilise pour tester:

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

S'il vous plaît, corrigez-moi si je me trompe!

Autres conseils

La " production " le code montré qui fonctionne apparemment est incohérent. Je soupçonne que la variable campaignForm est censée être la forme du champ.

Mais je pense que le problème fondamental est que la fenêtre modale elle-même n'est nulle part attachée à un composant et ne peut donc pas être rendue.

Si dans le code réel, il est attaché quelque part en dehors de votre composant MyModalWindowPanel, vous devrez certainement le joindre également au cours du test, probablement en faisant en sorte que votre test génère une page de test ou un panneau de test contenant à la fois fenêtre modale et le composant à tester.

La seule fois où j'ai eu cette " Aucune page trouvée " exception était lorsque vous essayez d'appeler getPage () dans un constructeur de panneau. Le constructeur est exécuté avant que le panneau ne soit ajouté à une page, de sorte que rien ne soit trouvé ... Faites-vous peut-être quelque chose comme ça? Peut-être que ce code fonctionne en production, mais jette toujours cette erreur en coulisse?

Je sais que ce n'est pas ce que vous recherchez, mais j'ai trouvé Selenium un excellent outil pour tester l'interface utilisateur Web. JUnit est excellent pour tester la logique, mais Selenium convient mieux pour s'assurer que la bonne chose s'affiche dans votre interface utilisateur. Il a l’air génial avec son interface graphique, etc., mais il fonctionne très bien, et si vous creusez un peu, l’API de script est facilement accessible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top