Unit testing 控制器单元测试方法?
我有这样一个控制器方法:Unit testing 控制器单元测试方法?,unit-testing,testing,grails,groovy,controller,Unit Testing,Testing,Grails,Groovy,Controller,我有这样一个控制器方法: def search = { def query = params.query ... render results as JSON } 如何进行单元测试?具体来说,我如何调用search来设置params.query,以及如何测试方法render的结果?有没有办法模拟渲染方法?有两种方法可以对控制器进行单元测试,但这需要您做一些更改 第一种方法是对控制器本身进行单元测试,而不增加http解析的复杂性,因此您可以编写单元测试
def search = {
def query = params.query
...
render results as JSON
}
如何进行单元测试?具体来说,我如何调用search来设置
params.query
,以及如何测试方法render
的结果?有没有办法模拟渲染方法?有两种方法可以对控制器进行单元测试,但这需要您做一些更改
第一种方法是对控制器本身进行单元测试,而不增加http解析的复杂性,因此您可以编写单元测试并将params.query作为单元测试的一部分传入,因此,将搜索函数拆分为两个函数:
def search = {
def query = params.query
render realSearch(query) as JSON
}
def realSearch ...
因此,第一部分测试realSearch
然后,第二部分是编写一个实际连接到web应用程序的应用程序,并进行功能测试,该测试将测试整个应用程序,包括第一部分中未测试的控制器部分。TFM:
遵循testCreateWithJSON()示例。。。只需将查询字符串填充到params['query'],设置contentType,调用search()。由于您显式调用render,因此最重要的事情是查看response.contentAsString。。。我可能只是对contentAsString进行模式匹配断言;您可以将其重新解析为JSON,然后检查对象树,但我怀疑这不会像简单的模式匹配断言那样清晰/快速。用于单元测试的子类。Grails将自动实例化控制器和模拟版本的render和redirect,使您能够轻松测试结果。只需将测试输入分配给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进行集成测试