Grails 进阶: 单元测试 ( unit testing in Grails )
访问量: 4420
假如,我们有一个controller: controllers/dashboard/StatusController.groovy (Assuming we have a controller )
1 package dashboard 2 3 class StatusController { 4 5 def index() { 6 } 7 8 }
我们要给它 加上单元测试,该怎么做呢? (how to add unit test for it? )
1. 建立文件: test/unit/dashboard/StatusControllerTests.groovy ( create a file )
1 package dashboard 2 import grails.test.mixin.* 3 import org.junit.* 4 5 @TestFor(StatusController) 6 class StatusControllerTests { 7 8 void testIndex () { 9 controller.index() 10 assertEquals "bar", controller.response.contentAsString 11 } 12 }
2. 运行: grails test-app StatusController 或者 $ grails test-app *Controller ( run $ grails test-app *Controller )
sg552@siwei-moto:~/workspace/dashborad$ grails test-app StatusController | Running 1 unit test... 1 of 1 | Failure: testIndex(dashboard.StatusControllerTests) | junit.framework.ComparisonFailure: expected:<[bar]> but was:<[]> at junit.framework.Assert.assertEquals(Assert.java:85) at dashboard.StatusControllerTests.testIndex(StatusControllerTests.groovy:16) | Completed 1 unit test, 1 failed in 6425ms | Packaging Grails application..... | Tests FAILED - view reports in /home/sg552/workspace/dashborad/target/test-reports
3. 但是尚未结束,当调用model的自动方法时出错:
| Failure: testInfo(dashboard.StatusControllerTests) | groovy.lang.MissingMethodException: No signature of method: dashboard.StationInfo.get() is applicable for argument types: () values: [] Possible solutions: get(java.io.Serializable), getId(), getIp(), grep(), grep(java.lang.Object), getAt(java.lang.String) at dashboard.StatusController.getResult(StatusController.groovy:14) ......
运行 $ grails test-app StatusController --integration 之后,就可以解决这个问题。参考: http://stackoverflow.com/a/9255043
3. 进一步: grails-app/conf/DataSource.groovy 可以看到数据库配置,相当于 rails 的 database.yml ( grails-app/conf/DataSource.groovy == database.yml in Rails )
一点体会: Grails运行单元测试的速度太慢了。 跑了一个UT下来,从回车到结果显示结束,耗费近60秒的时间。 实际上我过了4秒就等不及开始溜号了。 ( However it's much slower that running Tests in Grails than in Rails. It takes almost 60 seconds to execute a unit tests while I lost my focus in 4 seconds )
RAILS一般都可以在10秒内启动,估计省去了GRAILS的编译过程。( and in Rails the total process often cost less than 10 seconds)