单元测试控制器方法?

时间:2010-05-17 01:05:21

标签: unit-testing testing grails groovy controller

我有一个像这样的控制器方法:

def search = {
    def query = params.query

            ...

    render results as JSON
}

我如何对此进行单元测试?具体来说,如何调用搜索来设置params.query,如何测试方法render的结果?有没有办法模拟渲染方法呢?

3 个答案:

答案 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,然后检查该对象树,但我怀疑它不会像简单的模式匹配断言一样清晰/快速。