具有'withFormat'和html内容类型的单元测试控制器给出了空的响应,除非明确调用'render'

在Grails 2.1.1应用程序中,我尝试单元测试使用 'withFormat'来呈现响应的控制器无论是HTML还是JSON。但是,对HTML内容类型的响应总是会导致 在我的测试中为空响应,除非我将它封装在闭包中并明确调用“呈现”。对于JSON, 它发回预期的响应。具有'withFormat'和html内容类型的单元测试控制器给出了空的响应,除非明确调用'render'

控制器:

import grails.converters.JSON 

class TestController {

def formatWithHtmlOrJson() {

withFormat {

html someContent:"should be HTML"

json {render new Expando(someContent:"should be JSON") as JSON}

}

}

测试:

@TestFor(TestController) 

class TestControllerTests {

void testForJson() {

response.format = "json"

controller.formatWithHtmlOrJson()

println("resp: $response.contentAsString")

assert response.json.properties.someContent == "should be JSON"

}

void testForHtml() {

response.format = "html"

controller.formatWithHtmlOrJson()

println("resp: $response.contentAsString")

// fails here, response is empty

assert response.text

//never gets this far

assert response.contentAsString.contains("HTML")

}

}

如上所述,对JSON这个工作,但对于HTML,我总是得到一个空 响应,除非我在一个包装的HTML检查关闭并明确地调用渲染,如下所示:

withFormat { 

html {

render someContent:"should be HTML"

}

文档建议我不需要这样做,例如:

withFormat { 

html bookList: books

js { render "alert('hello')" }

xml { render books as XML }

}

从http://grails.org/doc/2.2.x/ref/Controllers/withFormat.html

无奈的是,在测试Grails的文档提到使用在withFormat,但只给测试XML/JSON,并没有对HTML响应的例子。

http://grails.org/doc/latest/guide/testing.html#unitTestingControllers

谁能解释这种差异,或如何我会解决它在我的 测试?

回答:

终于想通了这一点。

在文档(http://grails.org/doc/latest/guide/testing.html#unitTestingControllers),它提到测试下测试操作控制器响应这样它会返回一个地图

import grails.test.mixin.* 

@TestFor(SimpleController)

class SimpleControllerTests {

void testShowBookDetails() {

def model = controller.showBookDetails()

assert model.author == 'Alvin Plantinga'

}

}

同样的方法适用于使用在withFormat控制器方法

所以我上面原来的例子:

withFormat { 

html someContent:"should be HTML"

...

测试变为:

void testForHtml() { 

response.format = "html"

def model = controller.formatWithHtmlOrJson()

assert model.someContent == "should be HTML"

}

文档是混乱一点点作为在withFormat部分未提到这种方法的。

值得注意的是,应任何人遇到这样的,如果HTML块是瓶盖内,不返回地图,而地图项的值,因此对于控制器代码:

withFormat{ 

html{

someContent:"should be HTML"

}...

测试检查变为:

 assert model == "should be HTML" 

或者,如果可以修改控制器代码,返回结果内的地图让你使用点符号来检查元件的值。对于此代码:

withFormat { 

html {

[someContent:"should be HTML"]

}....

试验检查:

assert model.someContent == "should be HTML" 

另外值得注意的是,在我原来的例子不使用HTML类型的关闭,你不能将该值作为映射返回 - 它会导致编译错误。

//Don't do this, won't compile 

withFormat {

html [someContent:"should be HTML"]

...

回答:

尝试在文档中提供

withFormat { 

html {

println("html")

[new Expando(test:"html")]

}

}

回答:

建议不使用closure和具有这种空话“Grails的搜索视图叫的grails-app /视图/书/ list.html.gsp,如果这找不到回滚到grails-app/views/book/list.gsp“。

当您使用closure作为html时,我们必须返回model作为动作或render的内容。由于在这种情况下,您正在使用htmlclosure必须呈现内容。

使用闭包(你的使用情况通过)

withFormat{ 

html {

test: "HTML Content" //This will not render any content

render(test: "HTML Content") //This has to be used

}

}

以上是 具有'withFormat'和html内容类型的单元测试控制器给出了空的响应,除非明确调用'render' 的全部内容, 来源链接: utcz.com/qa/263134.html

回到顶部