3
  • 圣杯 2.2.4
  • 斯波克 0.7

我正在尝试测试是否从 grails 控制器呈现了正确的视图。我的创建方法如下所示:

def create() {
    def documentCategories = DocumentCategory.list()
    def documentTypes = DocumentType.list()
    def documentComponents = DocumentComponent.list()
    [documentCategories: documentCategories,
        documentTypes: documentTypes,
        documentComponents:documentComponents]
}

我的测试:

def "test create action"() {
    given:
    def model = controller.create()

    expect:
    response.status == 200
    model.documentCategories.size() == 0
    model.view == '/document/create'
}

我尝试了各种版本,model.view包括:

view == '/document/create'
response.forwardedUrl == '/document/create'

所有这些都失败了,因为model.view,viewresponse.forwardedUrl都为空。建议?

4

3 回答 3

4

由于您没有在控制器方法中显式定义视图,因此将执行 Grails 约定。根据文档,将选择与控制器名称和方法名称匹配的视图 --> view: "controllerName/methodName"

关于您的问题,您不应该测试 Grails 框架是否正常工作。您应该测试您的控制器是否按照您的意愿运行。

在这种情况下,您要测试您的控制器是否没有指定视图,因为这是您的控制器的预期行为。

对此的测试将是:

   then:
    controller.modelAndView == null
    response.redirectedUrl == null

如果您在控制器中调用“渲染(视图:xxx)”,则会创建 modelAndView。

在控制器中调用 redirect() 或 chain() 会导致 response.redirectedUrl 被填充到单元测试中

于 2013-12-07T13:57:11.133 回答
1
view.endsWith('/document/create')

应该提供工作,viewmodelcontroller.

//controller
render view: 'create', model: [documentCategories: documentCategories,
                               documentTypes: documentTypes,
                               documentComponents:documentComponents]

在 JUnit 测试的情况下,明确提及viewandmodel是可选的,但对于 Spock 规范,它是必需的。

于 2013-08-26T19:40:04.170 回答
0

尝试按照Grails 测试文档中的说明将以下内容添加到您的测试中

import grails.test.mixin.TestFor
@TestFor(MyController)
于 2013-08-26T19:31:50.557 回答