本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
chinajavawolf
页面或组件的单元测试
你可以非常容易的对某一页面或组件进行单元测试。跟随下面简单的工作:
为了测试页面,你需要创建一个
PageTester.实例。它担当浏览器和servlet容器以使你可以使用它驾驭你的页面。事实上它不是一个真正的servlet容器,你需要告诉它你定义在web.xml中的同样信息:
- 你的应用包
- 你的过滤器名。这仅被用来装载你的Tapestry IoC模块。如果你没有,你可以传递一个空字符串或任何东西给它。
- 担当你上下文根目录的文件夹。这被用来定位你的模版(如果它们放在那里)。
这是一个例子(使用TestNG,但你也可以使用JUnit或其他的):
- public class MyTest extends Assert
- {
- @Test
- public void test1()
- {
- String appPackage = "org.example.app";
- String appName = "App1";
- PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");
- }
- }
要测试页面是否完全呈现,你可以告诉PageTester去呈现它,然后对返回的DOM文档(
DOM Document)进行断言。
这是个例子。让我们假定被测试页名为”MyPage”并且它应该返回一个包含id为”id1”的HTML元素的页面并且它的文本内容应该是”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");
- }
- }
如果页面需要一个文本,你可以通过这种方法传递:
- 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");
- }
- }
页面呈现后,你应该想要”点击”一个action链接,然后对结果页断言。你可以这样做:
- 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"));
- }
- }
页面呈现后,你应该想要填充表单,提交它然后检查结果页。你可以这样做:
- 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 fieldValues = new HashMap();
- fieldValues.put("field1", "hello");
- fieldValues.put("field2", "100");
- doc = tester.submitForm(form, fieldValues);
- assertTrue(doc.toString().contains("abc"));
- }
- }
要对组件进行单元测试,仅需要创建一个包含这个组件的测试页面。然后测试这个页面就可以了。.
你的页面典型的是调用你的业务逻辑并且最终涉及到数据库。在单元测试时,尤其是测试你的UI(页面)时,强烈建议你不要调用它们。为了这样做,你应该放入你的事物控制代码,业务逻辑等到Tapestry IoC服务内。然后你应该使用mock 对象替换它们的执行。
- public class MyTest extends Assert
- {
- @Test
- public void test1()
- {
- String appPackage = "org.example.app";
- String appName = "LocaleApp";
- Map serviceOverrides = new HashMap();
- Service1 service1Mock = new Service1() {
- public Object transform(Object input) {
-
- }
- }
- Service2 service2Mock = new Service2() {
- public void perform(Object cmd) {
-
- }
- }
- serviceOverrides.put("Service1", service1Mock);
- serviceOverrides.put("Service2", service2Mock);
- PageTester tester = new PageTester(appPackage, appName, "src/main/webapp", serviceOverrides);
- }
- }