使用Grails Spock Unit Test for Controllers断言视图

时间:2013-08-26 15:07:30

标签: unit-testing grails spock

  • Grails 2.2.4
  • Spock 0.7

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

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.viewviewresponse.forwardedUrl都为空。建议?

3 个答案:

答案 0 :(得分:4)

由于您未在控制器方法中明确定义视图,因此将发生Grails约定。根据文档,将选择与控制器和方法的名称匹配的视图 - > view:“controllerName / methodName”

关于您的问题,您不应该测试Grails框架是否正常工作。您应该测试控制器的行为是否符合您的要求。

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

对此的测试将是:

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

如果您在控制器中调用'render(view:xxx)',将创建modelAndView。

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

答案 1 :(得分:1)

view.endsWith('/document/create')

应提供view工作,model明确呈现controller

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

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

答案 2 :(得分:0)

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

import grails.test.mixin.TestFor
@TestFor(MyController)