在Grails 2.3.8中测试.gsp页面的渲染内容

时间:2014-09-04 15:29:13

标签: grails testing

第一次问这里。我会切入正确的追逐。我试图测试控制器的渲染视图,但我还没有找到任何明确的方法来做到这一点。特别是,我试图做的是测试.gsp呈现的实际内容;即,如果呈现的html页面包含项目列表(列表,例如<ul><li>标签),或者页面应显示的任何其他内容。这可能吗?甚至是一种有效的方法来测试这种东西?我尝试过这样的事情:

控制器:

class ConnectedPairController {

    def show(int id) {
        //Some logic to populate collections and stuff

        render(view:"show.gsp", model:['pqc':cp.getPath(),
                           'connected':cp.getPage(), 
                           'instance':coll, 
                           'pagesCollection':colPages])
    }

测试:

@TestFor(ConnectedPairController)

    class ConnectedPairControllerSpec extends Specification {
        void "test show"() {    
        when:
            controller.show(4) //4 being the id of the content I want to display
        then:
            controller.response.text.contains "Some string or html tag the page should display"
        }
    }

但返回的文本为null。也许这就是它应该如何,但有没有办法获得渲染内容?

我在文档中找到的内容没有用(至少不是我想要做的),因为恕我直言,它只测试琐碎的东西,比如正在呈现的.gsp,或变量的内容:

@TestFor(SimpleController)
class SimpleControllerSpec extends Specification {

    void 'test home'() {
    when:
    controller.home()

    then:
    view == '/simple/homePage'
    model.title == 'Hello World'
    }
}

我希望我足够清楚。谢谢你的时间。

PS:我使用的是Grails 2.3.8。如果您需要与环境有关的任何其他信息,请告知我们。

2 个答案:

答案 0 :(得分:0)

单元测试中未完全呈现响应。 response.text will always be null when rendering views.

单元测试的目的是测试一个单元并模拟其周围的一切。视图层位于该单元之外。

如果您想测试视图,请尝试GroovyPageUnitTestMixin

先生。 Haki有good post on how to test views and templates解释如何测试它们。

答案 1 :(得分:0)

@ColinHarrington感谢您的回答,对此感到抱歉。我已经尝试过在这些网站上说的内容,但无论我呈现什么视图(.gsp)(就像一个只呈现变量内容的简单页面),render方法总是返回null (甚至不是空字符串)。

控制器:

class TestingController {

    def index() {
        render view: "testing.gsp", model: [test:"Test String"]
    }
}

测试:

import grails.test.mixin.TestMixin
import grails.test.mixin.web.GroovyPageUnitTestMixin
import spock.lang.Specification


@TestMixin(GroovyPageUnitTestMixin)
class TestingControllerSpec extends Specification {
    def controller

    def setup() {
        controller = testFor(TestingController)
    }

    void "test something"() {
        when:
            controller.index()
        then:
            render (view:"/testing/testing.gsp", model:model) == "Test String"
    }
}

测试结果:

test something(webbluefinder.TestingControllerSpec)
 |
Condition not satisfied:
render (view:"/testing/testing.gsp", model:model) == "Test String"
|                                          |      |
null                                       |      false
                                       [test:Test String]

我也尝试过Haki先生的方法,并得到了相同的结果。 你碰巧知道为什么会这样吗?谢谢你的时间。