我有一个控制器方法如下:
def search = {
def query = params.query
...
render results as JSON
}
我该如何对这个进行单元测试?具体来说,我应该如何调用search方法来设置params.query
,以及如何测试render
方法的结果?也许有一种方法可以模拟render方法吗?
我有一个控制器方法如下:
def search = {
def query = params.query
...
render results as JSON
}
我该如何对这个进行单元测试?具体来说,我应该如何调用search方法来设置params.query
,以及如何测试render
方法的结果?也许有一种方法可以模拟render方法吗?
为了进行单元测试,请继承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
}
}
有两种方法可以对控制器进行单元测试,但需要进行一些更改。
第一种方法是对控制器本身进行单元测试,而不添加http解析的复杂性,因此您将编写单元测试并将params.query作为单元测试的一部分传递,因此将搜索函数拆分为两个函数:
def search = {
def query = params.query
render realSearch(query) as JSON
}
def realSearch ...
首先,第一部分测试 realSearch
。
然后第二部分是编写一个应用程序,实际连接到您的 Web 应用程序,并进行功能测试,测试整个应用程序,包括第一部分未测试的控制器部分。
TFM: Grails参考章节9
按照testCreateWithJSON()示例...只需将查询字符串放入params['query']中,设置contentType,调用search()。由于您明确调用了render,最简单的方法是查看response.contentAsString...我可能会对contentAsString进行模式匹配断言;您可以重新解析它为JSON,然后检查对象树,但我怀疑这不会像简单的模式匹配断言那样清晰/快速。