`
chinajavawolf
  • 浏览: 116811 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

(A22)Tapestry Core:Unit testing pages or components

阅读更多
本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
chinajavawolf  
页面或组件的单元测试
你可以非常容易的对某一页面或组件进行单元测试。跟随下面简单的工作:
  • 设置一个操作环境
为了测试页面,你需要创建一个PageTester.实例。它担当浏览器和servlet容器以使你可以使用它驾驭你的页面。事实上它不是一个真正的servlet容器,你需要告诉它你定义在web.xml中的同样信息:
  1. 你的应用包
  2. 你的过滤器名。这仅被用来装载你的Tapestry IoC模块。如果你没有,你可以传递一个空字符串或任何东西给它。
  3. 担当你上下文根目录的文件夹。这被用来定位你的模版(如果它们放在那里)。
这是一个例子(使用TestNG,但你也可以使用JUnit或其他的):
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "App1"// App1Module.java has configured some services.   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.     }   
  10. }   
  • 测试呈现页
要测试页面是否完全呈现,你可以告诉PageTester去呈现它,然后对返回的DOM文档(DOM Document)进行断言。
这是个例子。让我们假定被测试页名为”MyPage”并且它应该返回一个包含id为”id1”的HTML元素的页面并且它的文本内容应该是”hello”
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.         Document doc = tester.renderPage("MyPage");   
  10.         assertEquals(doc.getElementById("id1").getChildText(), "hello");   
  11.     }   
  12. }   
如果页面需要一个文本,你可以通过这种方法传递:
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.         Object[] context = new Object[]{ "abc"123 };   
  10.         Document doc = tester.invoke(new ComponentInvocation(new PageLinkTarget("MyPage"), context));   
  11.         assertEquals(doc.getElementById("id1").getChildText(), "hello");   
  12.     }   
  13. }   
  •  测试一个action 链接
页面呈现后,你应该想要”点击”一个action链接,然后对结果页断言。你可以这样做:
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.         Document doc = tester.renderPage("MyPage");   
  10.         Element link = doc.getElementById("link1");   
  11.         doc = tester.clickLink(link);   
  12.         assertTrue(doc.toString().contains("abc"));   
  13.     }   
  14. }   
  •  测试表单提交
页面呈现后,你应该想要填充表单,提交它然后检查结果页。你可以这样做:
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp");   
  9.         Document doc = tester.renderPage("MyPage");   
  10.         Element form = doc.getElementById("form1");   
  11.         Map fieldValues = new HashMap();   
  12.         fieldValues.put("field1""hello");   
  13.         fieldValues.put("field2""100");   
  14.         doc = tester.submitForm(form, fieldValues);   
  15.         assertTrue(doc.toString().contains("abc"));   
  16.     }   
  17. }   
通过点击一个提交按钮提交表单,调用clickSubmit()方法。
  •   组件的单元测试
要对组件进行单元测试,仅需要创建一个包含这个组件的测试页面。然后测试这个页面就可以了。.
  • 提供mock执行你的服务层
你的页面典型的是调用你的业务逻辑并且最终涉及到数据库。在单元测试时,尤其是测试你的UI(页面)时,强烈建议你不要调用它们。为了这样做,你应该放入你的事物控制代码,业务逻辑等到Tapestry IoC服务内。然后你应该使用mock 对象替换它们的执行。
  1. public class MyTest extends Assert   
  2. {   
  3.     @Test  
  4.     public void test1()   
  5.     {   
  6.         String appPackage = "org.example.app";   
  7.         String appName = "LocaleApp";   
  8.         Map serviceOverrides = new HashMap();   
  9.         Service1 service1Mock = new Service1() {   
  10.             public Object transform(Object input) {   
  11.                 //assert against the input and return some mock value   
  12.             }   
  13.         }   
  14.         Service2 service2Mock = new Service2() {   
  15.             public void perform(Object cmd) {   
  16.                 //assert against the cmd   
  17.             }   
  18.         }   
  19.         serviceOverrides.put("Service1", service1Mock);   
  20.         serviceOverrides.put("Service2", service2Mock);   
  21.         PageTester tester = new PageTester(appPackage, appName, "src/main/webapp", serviceOverrides);   
  22.     }   
  23. }   
 
分享到:
评论

相关推荐

    欧姆龙旋钮型选择开关(圆型φ22) A22R□说明书.pdf

    欧姆龙旋钮型选择开关(圆型φ22) A22R□说明书pdf,欧姆龙旋钮型选择开关(圆型φ22) A22R□:高品位的按钮开关,满足各方面的需求。采用金属装饰环,成就牢固、高品味的面板设计。圆角形的设计加工,彰显人性化。开关...

    dell_O3010_A22.exe

    A22版本。 此软件包中包含 BIOS 更新,适用于运行 Windows 和 DOS 操作系统的戴尔 OptiPlex 3010。BIOS 是嵌入在计算机系统板上的小型内存芯片上的固件。它可以控制键盘、显示器、磁盘和其他设备。此软件包修复了...

    欧姆龙钥匙型选择开关(圆型φ22/25) A22K.pdf

    欧姆龙钥匙型选择开关(圆型φ22/25) A22Kpdf,欧姆龙钥匙型选择开关(圆型φ22/25) A22K:φ22和φ25共用。可用摆杆方便的拆卸单元。开关部位3列安装,提高了布线效率。标准配备了防指触功能的开关。使用φ25用的环还能...

    欧姆龙钥匙型选择开关(圆型φ22) A22RK说明书.pdf

    欧姆龙钥匙型选择开关(圆型φ22) A22RK说明书pdf,欧姆龙钥匙型选择开关(圆型φ22) A22RK:高品位的按钮开关,满足各方面的需求。采用金属装饰环,成就牢固、高品味的面板设计。圆角形的设计加工,彰显人性化。开关部...

    欧姆龙按钮开关(圆型φ22) A22R.pdf

    欧姆龙按钮开关(圆型φ22) A22Rpdf,欧姆龙按钮开关(圆型φ22) A22R:高品位的按钮开关,满足各方面的需求。采用金属装饰环,成就牢固、高品味的面板设计。圆角形的设计加工,彰显人性化。开关部可以叠加,能够灵活...

    LORA39c_t400a22d1a 远距离通信资料(免费)

    《LoRa39c_t400a22d1a 远距离通信技术详解》 LoRa39c_t400a22d1a是一款基于LoRa(Long Range)技术的远距离通信模块,它在物联网(IoT)领域广泛应用,尤其在低功耗、广覆盖的场景中表现出色。本资料包涵盖了该模块的...

    Omron A22E紧急停止用按钮开关产品样本.pdf

    奥姆龙(Omron)A22E紧急停止按钮开关是一款工业用的电子控制设备,它用于在紧急情况下快速切断电路,确保设备和人员的安全。从提供的文件内容中,我们可以提取出多个与该产品相关的知识点,具体如下: 1. 产品概述...

    wbexe647_a22.exe

    wbexe647_a22.exe

    A22R_M22R系列按钮开关_信号灯选型样本(中文)

    《A22R_M22R系列按钮开关与信号灯选型指南》 在工业自动化领域,按钮开关和信号灯是不可或缺的元件,它们在设备控制、生产线监控以及操作界面中发挥着至关重要的作用。A22R和M22R系列作为这类产品的代表,以其优异...

    欧姆龙旋钮型选择开关(圆型φ22/25) A22□.pdf

    欧姆龙旋钮型选择开关(圆型φ22/25) A22□pdf,欧姆龙旋钮型选择开关(圆型φ22/25) A22□:φ22和φ25共用。可用摆杆方便的拆卸单元。开关部位3列安装,提高了布线效率。标准配备了防指触功能的开关。使用φ25用的环...

    A22R_M22R系列按钮开关.pdf

    根据提供的文件内容,A22R和M22R系列按钮开关的相关知识点如下: 1. 产品系列名称和用途 文件中提到的A22R/M22R系列按钮开关是用于机械、工业、电子等设备中的操作控制元件。它们通常作为电子设备或机械装备上的...

    穆勒产品介绍——A22按钮指示灯.ppt

    穆勒产品介绍——A22按钮指示灯ppt,穆勒产品介绍——A22按钮指示灯

    thinkpad a22m mouse

    thinkpad a22m mouse 驱动程序

    欧姆龙安全产品a22e_ds_e_15_3_csm1265.pdf

    欧姆龙A22E系列安全停止开关是一种用于工业安全控制的重要设备,主要设计为22直径或25直径面板开孔安装。该产品的特点包括: 1. 直接开启机制:当接触点焊接时,该机制能自动断开电路,以确保在故障情况下能够快速...

    欧姆龙按钮开关(圆型φ22/25) A22.pdf

    欧姆龙按钮开关(圆型φ22/25) A22pdf,欧姆龙按钮开关(圆型φ22/25) A22:φ22和φ25共用(使用环时)。可用摆杆方便的拆卸单元。开关部位3列安装,提高了布线效率。标准配备了防指触功能开关。φ25用的环还能对应φ25的...

    默勒 按钮和指示灯A22系列选型手册.pdf

    但是,我可以根据提供的标题和描述,以及通用的行业知识来描述“默勒 按钮和指示灯A22系列选型手册”的相关知识点。 标题:“默勒 按钮和指示灯A22系列选型手册.pdf” 描述:“默勒 按钮和指示灯A22系列选型手册pdf...

    DELL E4200 最新BIOS A22

    DELL 笔记本电脑 E4200最新版BIOS A22版

    a22a-dev:只是GitHub活动...仅此而已。

    你好 :waving_hand: ,我是Avinash A Kanaujiya 来自印度的热情开发者。 我目前正在纯粹出于教育兴趣而开发自己的手工博客。 我目前正在与11ty &一起玩,正在学习操作系统,同时熟悉DSA 。 :closed_mailbox_with_...

    A22-JV65.zip

    【标题】:“A22-JV65.zip”是一个压缩文件,其中包含了关于“电影《我不是药神》的响应式页面设计”的相关素材。这个压缩包可能是一个项目或教程的一部分,用于展示如何创建一个响应式的网页,特别是针对这部电影的...

    Python库 | holdingsparser-0.1.0a22.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:holdingsparser-0.1.0a22.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

Global site tag (gtag.js) - Google Analytics