具有'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
的内容。由于在这种情况下,您正在使用html
closure
必须呈现内容。
使用闭包(你的使用情况通过)
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