Tapestry provides support for easily unit testing your pages and components. Follow the simple steps below.
In order to unit test a page, you'll need to create an instance of PageTester. It acts as both the browser and the servlet container so that you can use it to drive your page.
The PageTester falls into a middle ground between pure unit testing and full-scale integration testing.
As the PageTester is not a real servlet container, you need to tell it the same information as you would in web.xml:
public class MyTest extends Assert { @Test public void test1() { String appPackage = "org.example.app"; String appName = "App1"; // App1Module.java has configured some services. PageTester tester = new PageTester(appPackage, appName, "src/main/webapp"); } } |
To test if a page renders properly (optionally with context), you can tell the PageTester to render it and then assert against the DOM Document returned.
Here is an example. Let's assuming the page being tested is named "MyPage" and it should return a page containing an HTML element whose id is "id1" and whose text content should be "hello":
public class MyTest extends Assert { @Test public void test1() { String appPackage = "org.example.app"; String appName = "LocaleApp"; PageTester tester = new PageTester(appPackage, appName, "src/main/webapp"); Document doc = tester.renderPage("MyPage"); assertEquals(doc.getElementById("id1").getChildText(), "hello"); } } |
If the page requires a context, you can pass it this way:
public class MyTest extends Assert { @Test public void test1() { String appPackage = "org.example.app"; String appName = "LocaleApp"; PageTester tester = new PageTester(appPackage, appName, "src/main/webapp"); Object[] context = new Object[]{ "abc", 123 }; Document doc = tester.invoke(new ComponentInvocation(new PageLinkTarget("MyPage"), context)); assertEquals(doc.getElementById("id1").getChildText(), "hello"); } } |
After rendering a page, you may want to "click" on an action link and then assert against the resulting page. You can do it this way:
public class MyTest extends Assert { @Test public void test1() { String appPackage = "org.example.app"; String appName = "LocaleApp"; PageTester tester = new PageTester(appPackage, appName, "src/main/webapp"); Document doc = tester.renderPage("MyPage"); Element link = doc.getElementById("link1"); doc = tester.clickLink(link); assertTrue(doc.toString().contains("abc")); } } |
After rendering a page, you may want to fill out a form, submit it and then inspect the resulting page. You can do it this way:
public class MyTest extends Assert { @Test public void test1() { String appPackage = "org.example.app"; String appName = "LocaleApp"; PageTester tester = new PageTester(appPackage, appName, "src/main/webapp"); Document doc = tester.renderPage("MyPage"); Element form = doc.getElementById("form1"); Map<String, String> fieldValues = new HashMap<String, String>(); fieldValues.put("field1", "hello"); fieldValues.put("field2", "100"); doc = tester.submitForm(form, fieldValues); assertTrue(doc.toString().contains("abc")); } } |
To submit a form by clicking a submit button, call the clickSubmit() method instead.
To unit test a component, just create a test page containing that component. Then unit test that page.