Unit testing Grails使用command对象对方法进行单元测试
我的单元测试有问题。这是我的单元测试:Unit testing Grails使用command对象对方法进行单元测试,unit-testing,grails,spock,command-objects,Unit Testing,Grails,Spock,Command Objects,我的单元测试有问题。这是我的单元测试: void "Test the update action performs an update on a valid domain instance"() { given: def aclServiceMock = mockFor(AclService) aclServiceMock.demand.updateRolePermissions { Role role, Map, roleMap, List permis
void "Test the update action performs an update on a valid domain instance"() {
given:
def aclServiceMock = mockFor(AclService)
aclServiceMock.demand.updateRolePermissions { Role role, Map, roleMap, List permissions -> return true }
controller.aclService = aclServiceMock.createMock()
def roleInstance = setupRoleController()
mockCommandObject RoleCommand
RoleCommand cmd = new RoleCommand(
authority: roleInstance?.authority,
description: roleInstance?.description
)
when:"A valid domain instance is passed to the update action"
controller.update(roleInstance, cmd)
then:"A redirect is issued to the show action"
response.redirectedUrl == "/role/index"
flash.message != null
flash.error == null
}
这是我从终端得到的结果:
| Failure: Test the update action performs an update on a valid domain instance(ph.gov.doe.core.acl.RoleControllerSpec)
| Condition not satisfied:
flash.message != null
| | |
[:] null false
at ph.gov.doe.core.acl.RoleControllerSpec.Test the update action performs an update on a valid domain instance(RoleControllerSpec.groovy:222)
我似乎不明白为什么我对那个特定方法的单元测试总是失败。也许我的命令对象mock是关键?提前谢谢
编辑:条件应为“response.redirectedUrl==”/role/index“”,我只是复制了错误的消息,因为当时我正在修改代码
编辑:这是控制器方法:
def update(Role roleInstance, RoleCommand roleCommand) {
Map roleMap = [:]
ArrayList collectPermission = [], getPermissions = [], roleList = []
def savedRoleInstance
/** collect selected permission into arraylist */
collectPermission.addAll(params?.selectedPermission ?: [])
getPermissions = Permission.findAllByIdInList(collectPermission)
def roleEditInstance = Role.get(params?.roleId)
/** Set data for validation of Role */
roleCommand.with {
id = roleEditInstance?.id
authority = params?.authority
description = params?.description
}
roleCommand.validate()
/** Check if the set of permission already exists */
roleList = RolePermission.findAllByPermissionInListAndRoleNotEqual(getPermissions, Role.findByAuthority('ROLE_SUPERADMIN'))?.role
def duplicateRolePermission = roleList.find { r -> r.getAuthorities().sort { it?.id } == getPermissions.sort { it?.id } && r != roleEditInstance }
if (collectPermission.isEmpty()) {
flash.error = message(code: 'role.permissions.blank', args: [message(code: 'role.label', default: params?.authority)])
respond roleInstance, model:[roleList: Role.list(), permissionList: Permission.findAllByAuthorityNotEqual('PERM_DASHBOARD_VIEW'), inheritPermission: params?.inheritPermission, selectedPermission: getPermissions], view: "edit"
} else if (roleCommand.hasErrors() || duplicateRolePermission != null) {
bindData(roleCommand, roleInstance)
if(duplicateRolePermission != null){
flash.error = message(code: 'role.permissions.unique', args: [message(code: 'role.label', default: getPermissions?.description)])
}
respond roleCommand.errors, model:[roleInstance: roleCommand,roleList: Role.list(), permissionList: Permission.findAllByAuthorityNotEqual('PERM_DASHBOARD_VIEW'), inheritPermission: params?.inheritPermission, selectedPermission: getPermissions, roleId: roleEditInstance?.id], view: "edit"
} else {
/** Save the Role */
roleMap = [authority: params?.authority, description: params?.description]
def savedRole = aclService.updateRolePermissions(roleEditInstance, roleMap, getPermissions)
if (currentAccount) {
auditLogService.logEvent(currentAccount.emailAddress, "UPDATE_ROLE_SUCCESS", "Successfully updated role details.", true)
}
flash.message = message(code: 'role.updated.message', args: [message(code: 'role.label', default: savedRole?.authority)])
flash.id = savedRole?.id
redirect action: 'view', params:[id: savedRole?.id]
}
}
看来你要测试的应用程序可以设计得更好。许多逻辑可以从控制器转移到服务(原则) 此外,您的测试看起来更像集成测试,而不是单元测试。所以我建议你去了解一下
祝你好运 你能把你的控制器代码也显示出来吗?哦,是的,对不起。我会编辑这篇文章。哇,你在控制器方法方面有很多进展。:)我怀疑您的部分问题是此行中的参数与AclService中方法的实际签名不匹配:
aclServiceMock.demand.updateRolePermissions{Role-Role,Map,roleMap,List-permissions->return true}
,因此它没有使用您的模拟。尝试删除映射后的多余逗号:aclServiceMock.demand.updateRolePermissions{Role-Role,Map-roleMap,List-permissions->return-true}
@LeslieV-oh,耶。射击那太笨拙了。谢谢你指出这一点。我试着再次进行测试,但仍然没有成功。我收到了同样的错误信息。是的,我们仍在改进每件事,一旦我们让mehods工作起来,我们将专注于提高效率。你是对的,我想我们将使用集成测试来代替。非常感谢。我建议同时使用单元测试、集成测试和功能测试。医生:这是个好建议。我一定会把这件事告诉团队的。非常感谢。