在当前的项目中,我正在使用很多集成测试。 对于您之外的非Grails用户, 集成测试将测试您的Controller API,您的服务以及所有可能非常整齐地发生的持久性。 从后端的角度来看,他们唯一无法测试的就是Grails过滤器,您需要对它们进行功能测试之类的东西。 在Grails世界中,Controller API映射到URLMappings.groovy文件中的URL请求。 这只是配置一个HTTP请求到哪个Controller的简单Groovy。
例如:
class UrlMappings {
static mappings = {
"/sports/rugby/ball" (controller: "rugbyBall", action = [POST: "createBall", DELETE: "removeBall", GET: "getBall"])
...
因此,在上面的示例中,HTTP请求/sports/rugby/ball
将转到RugbyBallController
并转到以下方法: createBall(), deleteBall(), getBall()
取决于天气,请求是GET, POST
还是DELETE
。 现在假设,您已经将所有项目设置为服务器处理橄榄球的CRUD操作,并且在进行了一些忙碌的冲刺之后,需要进行一些软件熵爬升,并且需要重构控制器API,但是在继续前进之前,请确保项目经理执行对您说:“您必须在客户端使用它们时支持所有现有的API”。
当事物投入生产时,这就是重构在现实世界中通常如何工作的方式。 总会有一个阶段来支持新旧版本,弃用旧版本,然后在每个人都乐于移除旧版本时。 无论如何,您首先要更新URLMappings.groovy
class UrlMappings {
static mappings = {
// Old APIs
"/sports/rugby/ball" ( controller: "rugbyBall", action = [POST: "oldCreateBall", DELETE: "oldRemoveBall", GET: "oldGetBall"])
...
// New APIs
"/sports/rugby/v2/ball" ( controller: "rugbyBall", action = [POST: "createBall", DELETE: "removeBall", GET: "getBall"])
...
URLMappings.groovy
显示旧的和新的。 旧的API将用于您已重命名的控制器方法。 使用这些API的客户端不会受到影响,因为它们仅发送HTTP请求,它们不知道这些端点后面是哪个Controller。 旧的API已经具有非常好的集成测试,并且我们的项目经理要求新的API在进入预生产阶段之前必须进行类似的质量集成测试。
def "test adding a single item to your cart"() {
setup: "Set up the Cart and Landing Controller"
//...
when:
//...
rugbyBallController.oldGetBall();
rugbyBall = JSON.parse(rugbyBallController.response.contentAsString)
then:
rugbyBall.isOval();
项目经理先生说:“我希望在周五之前添加所有这些新测试,否则您下班后不打算喝点啤酒。 您需要一种快速的方法来完成集成测试”。 考虑到这种凉爽的啤酒及其在喉咙后部的熄灭效果,您还记得Groovy对动态调用方法的出色支持,您可以在其中将方法的名称指定为变量。
myObject."$myMethod"() // myMethod is a Groovy String variable.
在上面的代码片段中, myMethod
是一个变量,它与您要在myObject
上调用的方法的名称相对应。 “ $ myMethod”表示对变量myMethod进行评估(当然它将是方法名称),()当然仅表示调用该方法。 当您记住旧的和新的API将返回完全相同的JSON时,就会发生Eureka时刻。 您需要做的是两次运行相同的测试,一次对旧代码运行,一次对新代码运行。 由于您将spock框架用于集成测试,因此可以使用where
块轻松实现。
def "test adding a single item to your cart"(String method) {
setup: "Set up the Cart and Landing Controller"
//...
when:
//...
rugbyBallController."$method"();
rugbyBall = JSON.parse(rugbyBallController.response.contentAsString)
then:
rugbyBall.isOval();
where:
method = ["oldGetBall", "getBall"]
快乐的时光。 现在去喝那啤酒。
翻译自: https://www.javacodegeeks.com/2014/05/grails-tip-refactoring-your-urls.html