Grails技巧:重构URL

在当前的项目中,我正在使用很多集成测试。 对于您之外的非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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值