我有一个像这样的控制器方法:
def search = {
def query = params.query
...
render results as JSON
}
我如何对此进行单元测试?具体来说,如何调用搜索来设置params.query
,如何测试方法render
的结果?有没有办法模拟渲染方法呢?
答案 0 :(得分:5)
您的单元测试的子类grails.test.ControllerUnitTestCase。 Grails将自动实例化您的控制器并模拟渲染和重定向的版本,以便您轻松地测试结果。只需将测试输入分配给controller.params即可设置测试。
示例:
class SomethingController {
def search = {
def query = params.query
...stuff...
render results as JSON
}
}
测试看起来像:
class SomethingControllerTests extends grails.test.ControllerUnitTestCase {
void testSearch() {
controller.params.query = "test query"
controller.search()
assertEquals "expected result", controller.response.contentAsString
}
}
注意:如果需要完整的数据库集成环境,也可以使用ControllerUnitTestCase进行集成测试。
答案 1 :(得分:0)
有两种方法可以对控制器进行单元测试,但需要对它进行一些更改。
第一个是对控制器本身进行单元测试,而不增加http解析的复杂性,所以你要编写单元测试并传入params.query作为单元测试的一部分,因此,将搜索功能分成两部分功能:
def search = {
def query = params.query
render realSearch(query) as JSON
}
def realSearch ...
所以,第一部分测试realSearch
。
然后第二部分是编写一个实际连接到Web应用程序的应用程序,并进行功能测试,测试整个应用程序,包括第一部分未测试的控制器部分。
答案 2 :(得分:0)
TFM :Grails ref chapter 9
按照testCreateWithJSON()示例...将查询字符串填充到params ['query'],设置contentType,调用search()。因为你是显式调用render,所以最重要的是查看response.contentAsString ...我可能只是对contentAsString进行模式匹配断言;您可以将其重新解析为JSON,然后检查该对象树,但我怀疑它不会像简单的模式匹配断言一样清晰/快速。