2013-08-26 46 views
3
  • 的Grails 2.2.4
  • 斯波克0.7

我想测试正确的观点是从一个Grails控制器呈现。我的创建方法如下:使用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.viewview ,和response.forwardedUrl都是空的。建议?

+0

凹凸填充!你有没有解决它?我处于类似的情况...... – marko

回答

4

正如你不会在控制器方法明确定义视图,然后Grails的约定将如期举行。因此到文档匹配控制器和控制方法的名称的视图将被选择 - >视图:“controllerName /方法名”

关于你的问题,你不应该测试的Grails框架工作。你应该测试你的控制器的行为,如你所愿。

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

试验,这将是:在你的控制器:如果你所说的“渲染(XXX视图)”

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

由于ModelAndView的将被创建。

呼叫重定向()或链()在你的控制器结果response.redirectedUrl在你的单元测试

0

尝试增加作为 Grails Test docs

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

已经存在并且没有什么区别 – Gregg

1
view.endsWith('/document/create') 

指定以下到您的测试应该工作提供了viewmodel明确从controller呈现。

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

在JUnit的情况下测试的viewmodel是可选的明确提及,但斯波克则需要天赋。

+0

我不想显式地呈现视图。所以这对我不起作用。 – Gregg

+0

@Gregg在这种情况下,我担心你需要退回到其适当地配合您的需要为这个特殊的测试JUnit测试。 – dmahapatro

相关问题