我正在尝试测试从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.view
,view
和response.forwardedUrl
都为空。建议?
答案 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测试的情况下,明确提及view
和model
是可选的,但对于Spock规范,它是必需的。
答案 2 :(得分:0)
尝试按照中的说明将以下内容添加到您的测试中 Grails Test docs
import grails.test.mixin.TestFor
@TestFor(MyController)