365bet地区365bet地区控制器测试

365bet地区在本指南中,我们探讨了365bet地区中的Controller测试

s尼拉夫·阿萨尔·塞尔吉奥·德尔阿莫

365bet地区版本 3.3.0

365bet地区培训

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

365bet地区在本指南中,您将探索365bet地区中的控制器测试。我们将重点介绍一些最常见的用例。

单元测试

  • 验证允许的方法

  • 验证模型, 意见, 状态重新导向

  • 使用服务时使用存根

  • 验证HTTP参数绑定到命令对象

  • 验证JSON负载是否绑定到命令对象

功能测试

  • JSON响应状态码

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails指南grails控制器测试初始

并按照下一节中的说明进行操作

您可以直接前往完成的例子如果你光盘进入grails指南grails控制器测试完成

编写申请

我们将编写一个涉及一个域类的简单CRUD应用程序学生.

我们将拥有一个控制器和一个服务类,我们将能够在这种情况下探索控制器测试方法

领域类和支架

我们将创建一个Domain类学生.

域类满足Model View Controller MVC模式中的M,并表示映射到基础数据库表上的持久实体。在365bet地区中,域是位于grails应用程序域目录中的类。

grails创建领域课程Student

添加域属性年级到创建的域类

grails应用程序域演示Student groovy
演示 常规转换CompileStatic

静态编译
 学生 {
    大十进制年级toString名称

如果您使用创建域类命令为域类创建一个Spock规范

删除这个档案

src测试groovy演示StudentSpec groovy

在中了解有关测试域类的更多信息如何测试域类约束指南

静态脚手架

365bet地区在365bet地区静态脚手架功能的帮助下为该域类生成一个控制器和视图

了解更多有关脚手架的信息365bet地区文档.
grails生成所有演示学生

前面的命令生成一个样本控制器和GSP视图,它为生成的控制器生成一个Spock规范。

grails应用程序控制器演示StudentController groovy grails应用程序视图学生创建gsp grails应用程序视图学生编辑gsp grails应用程序视图学生索引gsp grails应用程序视图学生显示gsp src测试常规示例演示StudentControllerSpec Groovy

这些工件为以下对象提供CRUD功能:学生域类

我们已经编辑了生成的控制器,并将处理事务行为的代码移到了服务中。您可以在完成

365bet地区365bet地区团队不鼓励将核心应用程序逻辑嵌入控制器内部,因为它不会促进重用和明确的关注点分离。控制器的职责是处理请求并创建或准备响应。控制器可以直接生成响应或委托给一个看法

单元测试指标法

指数动作方法返回一个学生清单学生人数作为模型回到视图

下一个代码示例显示了指数的方法学生控制器.

grails应用程序控制器演示StudentController groovy
演示 静态的 org springframework http HttpStatus创建
 静态的 org springframework http HttpStatus确定
 静态的 org springframework http HttpStatus未找到
 静态的 org springframework http HttpStatus没有内容
 org springframework上下文MessageSource
 常规转换CompileDynamic
 常规转换CompileStatic

静态编译
 学生控制器 {

    静态的allowedMethods: '开机自检',
                             更新: '',
                             : '删除'StudentService studentService MessageSource messageSource定义 指数(整数最大参数最大数学最小最大10, 100)
        清单studentList studentService服务列表参数响应studentList模型: [学生人数学生服务数量

上一个动作使用协作者的服务来获取一些对象,然后将这些对象作为模型返回。我们将验证服务返回的对象确实已用作模型。

什么时候应该使用Mock,什么时候应该使用Stub

从书中加速运行

如果测试与证明测试对象以特定方式与协作者进行交互有关,请使用模拟方法。如果协作者以某种方式行为的事实暴露了测试对象中的特定行为,则行为是您正在测试的使用存根

src测试groovy演示StudentControllerSpec groovy
演示 365bet地区测试Web控制器ControllerUnitTest
 spock lang规格

 StudentControllerSpec 延伸规格实施ControllerUnitTest {
    定义 '测试索引动作是否返回正确的模型'() {
        给定:
        清单样本学生学生: '紧张', 年级: 100),
                                        学生: '杰夫', 年级: 95),
                                        学生: '塞尔吉奥', 年级: 90控制器StudentService存根学生服务列表样本学生计数样本学生人数什么时候: '执行索引动作'控制器索引然后: '型号正确'模特学生列表(1)模特学生列表大小3模特学生列表查找那么'紧张' && 年级100模特学生列表查找那么'杰夫' && 年级95模特学生列表查找那么'塞尔吉奥' && 年级90示范学生人数3
    }
}
1 我们可以验证模型是否包含我们期望的信息

单元测试保存方法

保存动作方法使用命令对象作为参数

查看指南使用命令对象处理表单数据了解有关命令对象的更多信息

grails应用程序控制器演示StudentSaveCommand groovy
演示 grails编译器365bet地区CompileStatic
 grails验证有效

365bet地区CompileStatic
 学生保存命令 实施有效期大十进制年级静态的约束名称可为空: 年级可为空: , : 0.0
    }
}
grails应用程序控制器演示StudentController groovy
演示 静态的 org springframework http HttpStatus创建
 静态的 org springframework http HttpStatus确定
 静态的 org springframework http HttpStatus未找到
 静态的 org springframework http HttpStatus没有内容
 org springframework上下文MessageSource
 常规转换CompileDynamic
 常规转换CompileStatic

静态编译
 学生控制器 {

    静态的allowedMethods: '开机自检',
                             更新: '',
                             : '删除'StudentService studentService MessageSource messageSource动态编译
    定义 StudentSaveCommand cmd如果cmd hasErrors(1)回应cmd错误模型: [学生指令: '创建']
            返回学生学生studentService保存cmd) (2)
        如果学生hasErrors(3)回应学生的错误:'创建'
            返回请求withFormat(4)形式multipartForm(5)
                msg messageSource getMessage'', []  宾语[], '学生'请求区域设置Flash消息messageSource getMessage'默认创建的消息' 宾语[], '学生创建'请求语言环境重定向行动: '', ID学生卡'*'回应学生状态已建立
1 365bet地区365bet地区绑定命令对象中的参数并调用验证在控制器之前行动开始
2 如果命令对象有效,它将尝试在协作服务的帮助下保存新学生
3 检查协作者的响应行动结果取决于协作者的响应
4 如果一切顺利,则将根据内容类型返回不同的答案
5 例如申请表x www表格urlencoded内容类型,它将重定向到显示学生的动作

我们可以使用下一个特征方法对其进行单元测试

src测试groovy演示StudentControllerSpec groovy
演示 365bet地区测试Web控制器ControllerUnitTest
 spock lang规格

 StudentControllerSpec 延伸规格实施ControllerUnitTest {

    定义 ''() {

        什么时候请求内容类型表格内容类型(1)请求方法'开机自检' (2)控制器保存然后学生模型'创建' (3)
    }

}
1 感谢测试注释,我们更改了请求的内容类型。根据ContentType,被测操作会输出不同的状态代码,请参见请求withFormat关闭
2 感谢测试注释,我们更改请求方法
3 我们可以验证使用的视图
src测试groovy演示StudentControllerSpec groovy
演示 365bet地区测试Web控制器ControllerUnitTest
 spock lang规格

 StudentControllerSpec 延伸规格实施ControllerUnitTest {

    定义 '如果用户同时提供名称和等级保存成功'() {
        给定:
        那么'紧张'
        大十进制年级100
        longID控制器StudentService存根StudentService保存学生那么年级年级ID我害怕学生那么年级年级IDID什么时候请求方法'开机自检'请求内容类型FORM CONTENT TYPE参数''那么(1)参数'年级'坡度控制器保存(2)

        然后: '将显示一条消息,指示用户已被保存'即时消息(3)

        : '重定向用户以显示学生'响应redirectedUrl startsWith'学生表演') (4)

        : '使用找到的响应代码'回应状态302 (5)
    }

}
1 像平常一样提供参数
2 365bet地区不要为操作方法提供参数调用不带参数的操作方法365bet地区进行绑定它更紧密地模拟实际代码中发生的情况
3 您可以检查是否已填入Flash消息
4 验证重定向的URL是我们期望的
5 您可以验证是否存在预期的状态码
src测试groovy演示StudentControllerSpec groovy
演示 365bet地区测试Web控制器ControllerUnitTest
 spock lang规格

 StudentControllerSpec 延伸规格实施ControllerUnitTest {

    虚空 'JSON有效负载绑定到命令对象。如果学生已保存,则返回a'() {
        给定:
        那么'紧张'
        大十进制年级100
        longID控制器StudentService存根StudentService保存学生那么年级年级IDID什么时候: 'JSON请求与域转换一起发送'请求方法'开机自检'请求json'那么'那么'年级'年级'}' (1)控制器保存然后: '设置了CREATED状态代码'回应状态201 (2)
    }

}
1 365bet地区365bet地区支持将JSON请求与命令对象的数据绑定
2 您可以验证是否存在预期的状态码

测试允许的方法

我们限制了在属性的帮助下仅对POST请求进行操作allowedMethods.

allowedMethods限制对基于HTTP请求方法的控制器操作的访问,当使用错误的HTTP方法时,该方法发送“方法不允许”错误代码

grails应用程序控制器演示StudentController groovy
    静态的allowedMethods: '开机自检',
                             更新: '',
                             : '删除',]

我们可以通过单元测试来验证

src测试groovy演示StudentControllerAllowedMethodsSpec groovy
演示 静态的 不允许使用javax servlet http http HttpServletResponse SC方法
 静态的 javax servlet http HttpServletResponse SC OK
 365bet地区测试Web控制器ControllerUnitTest
 spock lang规格
 spock lang展开

 StudentControllerAllowedMethodsSpec 延伸规格实施ControllerUnitTest {

    展开
    定义 "StudentController保存不接受方法请求"(方法什么时候请求方法方法控制器保存然后响应状态SC方法不允许哪里方法'补丁', '删除', '得到', '']
    }

    定义 "StudentController保存接受POST请求"() {
        什么时候请求方法'开机自检'控制器保存然后响应状态SC OK

功能测试

我们将使用功能测试来验证index方法是否返回带有学生列表的JSON负载

我们可以用RestBuilder的365bet地区从Rest Client Builder 365bet地区插件中导入依赖项建立gradle.

建立gradle
依赖项testCompile"组织grails grails数据存储区其余客户端"
}

我们可以通过在RestBuilder的API我们将获得休息响应对象,并使用该对象可以验证控制器返回的项目

下一个功能方法调用指数操作并返回学生的JSON列表

src集成测试groovy演示StudentControllerIntSpec groovy
演示 grails插件rest client RestBuilder
 grails插件其余客户端RestResponse
 grails测试mixin集成集成
 spock lang共享
 spock lang规格

 grails交易回滚

积分
回滚
 StudentControllerIntSpec 延伸规格共享RestBuilder的休息RestBuilder的定义 设定学生全部保存学生: '紧张', 年级: 100),
                学生: '杰夫', 年级: 95),
                学生: '塞尔吉奥', 年级: 90),
        )
    }

    定义 '在URI中测试json以返回学生'() {
        什么时候RestResponse响应休息获取"HTTP本地主机${服务器端口}学生json")  (1) (2)

        然后状态200 (3)分别为json大小3响应json查找年级100 && 那么'紧张'响应json查找年级95 &&  那么'杰夫'响应json查找年级90 &&  那么'塞尔吉奥' }
    }
}
1 json可以附加到URL以声明我们需要JSON响应
2 服务器端口自动注入
3 使用休息响应对象以验证状态代码JSON有效负载等
服务器端口365bet地区属性是自动注入的,它包含功能测试期间运行365bet地区应用程序的随机端口

摘要

总结本指南,我们了解了

  • 使用控制器单元测试属性进行验证模型视图状态和重定向.

  • 在控制器操作方法中验证到命令对象的数据绑定

  • 使用集成测试来调用控制器并进行端到端测试

运行应用程序

运行测试

grailsw grails测试应用程序grails打开测试报告

要么

Gradlew测试

365bet地区帮助365bet地区

365bet地区服务:

免费咨询

OCI 365bet地区团队包括365bet地区联合创始人检查我们的并向发展和维护365bet地区的工程师学习

Grails OCI团队