我有一个控制器方法,就像这样:单元测试控制器方法?
def search = {
def query = params.query
...
render results as JSON
}
我如何单元测试呢?具体来说,如何调用搜索来设置params.query
,以及如何测试方法render
的结果?也许有办法模拟渲染方法吗?
我有一个控制器方法,就像这样:单元测试控制器方法?
def search = {
def query = params.query
...
render results as JSON
}
我如何单元测试呢?具体来说,如何调用搜索来设置params.query
,以及如何测试方法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
}
}
注意:您可以使用ControllerUnitTestCase集成测试过,如果你需要一个完整的集成环境中完整的数据库。
有两种方法可以对控制器进行单元测试,但需要对其进行一些更改。
首先是单元测试控制器本身,而不会增加http解析的复杂性,所以你可以编写你的单元测试并作为单元测试的一部分传入params.query,因此,将搜索功能分解为两个功能:
def search = {
def query = params.query
render realSearch(query) as JSON
}
def realSearch ...
所以,第一部分测试realSearch
。
然后第二部分是编写一个应用程序,它将实际连接到您的Web应用程序,并执行功能测试,它将测试您的整个应用程序,包括未在第一部分中测试的控制器部分。
按照testCreateWithJSON()例子...只是把这些东西您的查询字符串到PARAMS [ '查询'],设置的contentType,呼叫搜索()。由于你明确地调用了渲染,所以最重要的事情是查看response.contentAsString ...我可能只是对contentAsString进行模式匹配断言;你可以将它重新解析为JSON,然后检查该对象树,但我怀疑这不会像简单的模式匹配断言那样清晰/快速。