grails - Controller 集成测试

标签 grails integration-testing

Controller 操作:

def deleteDept = {

        def departmentInstance = Department.findByName(params.department.name)

        if (!departmentInstance) {
            println "no dept instance"
            throw new org.codehaus.groovy.grails.exceptions.NewInstanceCreationException ("could not create DeptInstance for ${params.department.name}")
        } else if (departmentInstance.paySvcs && !departmentInstance.paySvcs.isEmpty()){
            println "instance with paySvcs"
            // !!!! do not delete the department if it has payment services !!!!
            departmentInstance.errors.reject('department.do.not.delete.message')
//            render(view: "editDept", model: [departmentInstance: departmentInstance])
            redirect(action: "editDept", id: departmentInstance.id)
        } else{
            println "proceed to delete"
            try {
                departmentInstance.delete(flush: true)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'department.label', default: 'Department'), departmentInstance.name])}"
                redirect(action: "appAdmin", id: departmentInstance.id)
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                println "something went wrong"
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'department.label', default: 'Department'), departmentInstance.name])}"
                redirect(action: "editDept", id: departmentInstance.id)
            }
        }
    }

集成测试:

        def AppAdminController controller = new AppAdminController()        // create the controller
        controller.metaClass.message = { Map p -> return "foo" }            // message dummy returning garbage - work around the controller message exception
        controller.params.department = [name:"dept1", phone:"817-273-3260", g_password:"password", street:"Main St.", g_userID:"user", unitCode:"1234567", email:"dept1@yahoo.com", zip:"75097", fax:"817-273-2222"]
        def dept2 = new Department (name: "Dept2", unitCode: "1234568", street: "Main St.", zip: "75097", fax: "817-273-2222", phone: "817-273 3260", email: "dept2@yahoo.com", g_userID: "user", g_password: "password")
        def dept1 = new Department (name: "Dept1", unitCode: "1234568", street: "Main St.", zip: "75097", fax: "817-273-2222", phone: "817-273 3260", email: "dept1@yahoo.com", g_userID: "user", g_password: "password")
        def math = new PaySvc()
        def another = new PaySvc()
        dept.paySvcs = []
        dept.paySvcs.add(math)
        dept.paySvcs.add(another)
        mockDomain(Department, [dept1, dept2])

        def svcTest = Department.findByName("Dept1")
        assertNotNull svcTest                                           // record Dept1 exists
        assertEquals 2, svcTest.paySvcs.size()                          // 2 paySvcs total

        controller.deleteDept()                                         // calling the action

        svcTest = null
        svcTest = Department.findByName("Dept1")
        assertNotNull svcTest                                           // record Dept1 still exists, it was not deleted
        // can't test render, controller.response.contentAsString is null
        // but testing at the UI is OK
 //       assertEquals "editDept", controller.response.contentAsString    // action should render "editDept"
        assertEquals "editDept", controller.redirectArgs.action

问题:

render(view: "editDept", model: [departmentInstance: departmentInstance]) 

在 UI 上手动测试时有效。但在集成测试中,使用render时controller.response为null,但使用redirect时返回预期的redirectArg。 有什么想法吗?

最佳答案

可能为时已晚,但可能会帮助其他人: 使用render,您需要在 Controller 上使用modelAndView对象,例如以下示例:

assertEqualscontroller.modelAndView.model.departmentInstance,departmentInstance

assertEqualscontroller.modelAndView.viewName,“/test/editDept”

祝你好运!

关于grails - Controller 集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4188697/

相关文章:

groovy - log4j 与 grails : How to get appender file name at run time?

file - grails 3.3.9从输入获取文件

tomcat - 在 Tomcat6 上运行的 Grails 应用程序抛出的 NotSerializableException

java - 如何从 TestNG IInvokedMethodListener 获取测试字段?

docker - 如何调试在 docker 容器中运行的 maven surefire 测试?

Maven 将多个 war 部署到嵌入式服务器以进行集成测试

grails db-generate-changelog 错误

grails - 类 [] 上的方法在 Grails 应用程序外部使用

maven - Maven单独的单元测试和集成测试

azure - 我可以从 Azure 上的部署生成代码覆盖率吗?