Locked History Actions

Diff for "wicket/ExWicketTester"

Differences between revisions 2 and 3
Deletions are marked like this. Additions are marked like this.
Line 78: Line 78:

== LoginPageの改良 ==

少なくともLoginPageクラスは以下のようにすべきだろう。

{{{

import org.apache.wicket.markup.html.*;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.markup.html.panel.*;
import org.apache.wicket.model.*;

public class LoginPage extends WebPage {
  
  static final String ID_FEEDBACK = "feedback";
  static final String ID_LOGINFORM = "loginForm";
  static final String ID_EMAIL = "email";
  static final String ID_PASS = "pass";
  
  public LoginPage() {
    add(new FeedbackPanel(ID_FEEDBACK));
    add(new LoginForm());
  }
  
  class LoginForm extends Form<Void> {
    
    private LoginForm() {
      super(ID_LOGINFORM);
      add(new TextField<String>(ID_EMAIL, new Model<String>()));
      add(new PasswordTextField(ID_PASS, new Model<String>()));
    }
    
    @Override
    public void onSubmit() {
      String mail = get(ID_EMAIL).getDefaultModelObjectAsString();
      String pass = get(ID_PASS).getDefaultModelObjectAsString();
      
      // login success or failed ....
    }
  }
}
}}}

拡張Wicketテスタ

ここでは、Wicketに標準で備わっているひどいテスタの代わりに、タイプセーフでリファクタリングに強い代替のテスタを提案してみる。

ひどいWicketプログラムとそのテスト

ひどいとは言っても、ごく普通に書くとこうなる。

<html>
<title>Login</title>
<body>
<div wicket:id="feedback"></div>
<form wicket:id="loginForm">
<table border="0">
 <tr><td>メールアドレス</td><td><input type="text" wicket:id="email"/></td></tr>
 <tr><td>パスワード</td><td><input type="password" wicket:id="pass"/></td></tr>
 <tr align="right"><td colspan="2"><input type="submit" value="ログイン"/></td></tr>
</table>
</form>
</body>
</html>

import org.apache.wicket.markup.html.*;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.markup.html.panel.*;
import org.apache.wicket.model.*;

public class LoginPage extends WebPage {
  
  public LoginPage() {    
    add(new FeedbackPanel("feedback"));
    add(new LoginForm());
  }
  
  class LoginForm extends Form<Void> {    
    
    private LoginForm() {
      super("loginForm");
      add(new TextField<String>("email", new Model<String>()));
      add(new PasswordTextField("pass", new Model<String>()));
    }    
    
    @Override
    public void onSubmit() {
      String mail = get("email").getDefaultModelObjectAsString();
      String pass = get("pass").getDefaultModelObjectAsString();
      
      // login success or failed ....     
    }
  }
}

import org.apache.wicket.util.tester.*;
import org.junit.*;

public class LoginTest {

  @Test
  public void test() {
    WicketTester tester = new WicketTester();
    tester.startPage(LoginPage.class);
    tester.assertRenderedPage(LoginPage.class);
    tester.assertNoErrorMessage();
    
    FormTester formTester = tester.newFormTester("loginForm");
    formTester.setValue("email", "sysdba");
    formTester.setValue("pass", "masterkey");
    formTester.submit();
    tester.assertNoErrorMessage();
    
  }
}

LoginPageの改良

少なくともLoginPageクラスは以下のようにすべきだろう。

import org.apache.wicket.markup.html.*;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.markup.html.panel.*;
import org.apache.wicket.model.*;

public class LoginPage extends WebPage {
  
  static final String ID_FEEDBACK = "feedback";
  static final String ID_LOGINFORM = "loginForm";
  static final String ID_EMAIL = "email";
  static final String ID_PASS = "pass";
  
  public LoginPage() {    
    add(new FeedbackPanel(ID_FEEDBACK));
    add(new LoginForm());
  }
  
  class LoginForm extends Form<Void> {    
    
    private LoginForm() {
      super(ID_LOGINFORM);
      add(new TextField<String>(ID_EMAIL, new Model<String>()));
      add(new PasswordTextField(ID_PASS, new Model<String>()));
    }    
    
    @Override
    public void onSubmit() {
      String mail = get(ID_EMAIL).getDefaultModelObjectAsString();
      String pass = get(ID_PASS).getDefaultModelObjectAsString();
      
      // login success or failed ....     
    }
  }
}